Ruby on Rails调用对象的方法

时间:2014-09-08 09:15:54

标签: ruby-on-rails ruby methods calling-convention

我不了解红宝石。

@items.each do |item| 
  item.column
end

将工作并返回rails中该列的值。但

item = @items[some_item_id]
item.column

会给我一个没有找到nil异常的方法。 两次我都得到了对象,但只有第一次我可以访问rails数据方法。

那些破灭了什么| ...... |我如何访问这些方法?

4 个答案:

答案 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变量基本上会被视为对象,这意味着在使用相应的数据填充它们时必须非常小心:

enter image description here

底线是,如@items = Item.all规定的那样,您无法设置object,然后通过数组中的ID调用项目。您处理find不是数组 - 它是一个对象,因此,您必须使用这些方法您可以访问所需的数据。

您可以通过两种方式访问​​所需的数据:

  
      
  1. 使用Item方法
  2.   
  3. 仅查找特定的.find条记录
  4.   

如果您不介意被黑客攻击,可以使用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}}