[英]Ruby on Rails calling methods of objects
关于红宝石我有些不明白的地方。
@items.each do |item|
item.column
end
将工作并返回rails中该列的值。 但
item = @items[some_item_id]
item.column
会给我一个没有找到nil异常的方法。 两次我都得到了对象,但只有第一次我可以访问rails数据方法。
什么破灭| ... | 我如何访问这些方法?
这是因为在第二种情况下你传递了错误的some_item_id
,所以@items[some_item_id]
找不到合适的item
并返回nil
。
@items.each do |item|
item.column
end
在上面的块ruby迭代从数据库中获取的记录所以你没有得到任何nil错误。 但在第二种情况下,您正试图从@items
的索引中获取记录。 它失败了,因为你的一些记录从数据库中删除了。 或者它只会在最后一条记录上失败,因为索引从0开始,而表的id从1开始。因此,当我们从索引调用时,会发生未匹配。
这会收集@items
所有元素以进入块:
@items.each
#each
将用于散列,数组和其他枚举。
这将选择@items
的特定元素 :
@items[some_item_id]
方括号是一个方法(名为#[]
),用于散列和数组中的元素引用。 如果您收到MethodNotFound
错误,则表示@items
不是哈希或数组,并且没有名为#[]
的方法。
如果@items
是ActiveRecord对象的集合,并且您想要按ID选择一个,请使用:
@items.find(some_item_id)
您需要了解ActiveRecord如何与Rails一起使用
ActiveRecord的
当你打电话,你在做什么@items.each do ...
通过循环收集的Item
对象在@items
变量。 因为ruby处理循环使用代码块 。
由于缺乏更好的解释,代码块本质上是小型的内联方法,它们有自己的局部变量,并且在使用循环时可以被调用(很像大多数其他编程语言)。 这里要注意的最重要的事情是@items
变量中的数据。
-
数据
Rails是一个面向对象的框架(由于构建在Ruby上)。 这意味着您的@instance
变量基本上被视为对象 ,这意味着在使用相应的数据填充它们时必须非常小心:
最重要的是,正如Marek
规定的那样,你不能设置@items = Item.all
,然后通过数组中的id来调用项目。 您正在处理的object
不是数组 - 它是一个对象,因此,您必须使用可用的方法来访问您需要的数据。
您可以通过两种方式访问所需的数据:
- 使用
find
方法- 仅查找特定的
Item
记录
如果你不介意hacky,你可以使用ActiveRecord .find
方法:
<% item = @items.find [your_item_id] %>
<%= item.column %>
这将使您能够在@items
集合中@items
特定项目。
或者,您可以通过在控制器中设置相关的@item
对象来“正确”执行操作:
#app/controllers/items_controller.rb
class ItemsController < ApplicationController
def show
@item = Item.find "your_id"
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.