我不了解红宝石。
@items.each do |item|
item.column
end
将工作并返回rails中该列的值。但
item = @items[some_item_id]
item.column
会给我一个没有找到nil异常的方法。 两次我都得到了对象,但只有第一次我可以访问rails数据方法。
那些破灭了什么| ...... |我如何访问这些方法?
答案 0 :(得分:1)
这是因为在第二种情况下,您传递了错误的some_item_id
,因此@items[some_item_id]
找不到合适的item
并返回nil
。
答案 1 :(得分:1)
@items.each do |item|
item.column
end
在上面的块中,ruby迭代从数据库中获取的记录所以你没有得到任何nil错误。但在第二种情况下,您尝试从@items
中的索引中获取记录。它失败了,因为你的一些记录从数据库中删除了。或者它只会在最后一条记录上失败,因为索引从0开始,而表的id从1开始。因此,当我们从索引调用时,会发生未匹配。
答案 2 :(得分:1)
这会将@items
内的所有元素收集到一个块中:
@items.each
#each
将适用于哈希,数组和其他枚举。
这会在@items
:
@items[some_item_id]
方括号是哈希和数组中元素引用的方法(名为#[]
)。如果您收到MethodNotFound
错误,则表示@items
不是哈希或数组,并且没有名为#[]
的方法。
如果@items
是ActiveRecord对象的集合,并且您想按ID选择一个,请使用:
@items.find(some_item_id)
答案 3 :(得分:0)
您需要了解ActiveRecord如何使用Rails
<强> ActiveRecord的强>
当您致电@items.each do ...
时,您正在循环浏览Item
变量中@items
个@items
个对象。因为ruby使用collection来处理循环。
由于缺乏更好的解释,代码块本质上是小型的内联方法,它们有自己的局部变量,并且可以在使用循环时调用(很像大多数其他编程语言)。这里要注意的最重要的事情是@instance
变量中的数据。
-
数据强>
Rails是一个code block框架(由于构建在Ruby上)。这意味着您的Marek
变量基本上会被视为对象,这意味着在使用相应的数据填充它们时必须非常小心:
底线是,如@items = Item.all
规定的那样,您无法设置object
,然后通过数组中的ID调用项目。您处理的find
不是数组 - 它是一个对象,因此,您必须使用这些方法您可以访问所需的数据。
您可以通过两种方式访问所需的数据:
- 使用
Item
方法- 仅查找特定的
醇>.find
条记录
如果您不介意被黑客攻击,可以使用ActiveRecord <% item = @items.find [your_item_id] %>
<%= item.column %>
方法:
@items
这将使您能够在@item
的集合中查找特定项目。
或者,你要做的事情&#34;正确&#34;通过在控制器中设置相关的#app/controllers/items_controller.rb
class ItemsController < ApplicationController
def show
@item = Item.find "your_id"
end
end
对象:
{{1}}