繁体   English   中英

Ruby on Rails调用对象的方法

[英]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 不是数组 - 它是一个对象,因此,您必须使用可用的方法来访问您需要的数据。

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

  1. 使用find方法
  2. 仅查找特定的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM