Rails视图中消失的对象实例

时间:2014-05-20 20:49:29

标签: ruby-on-rails

我在" List"中创建了一个公共方法。将找到替代品的模型"项目"鉴于项目ID。我已经对样本中的id进行了硬编码(行为与变量相同)。

以下是List模型:

class List < ActiveRecord::Base
  def substitute_item
    Item.find(1)
  end
end

我访问由List的show视图呈现的partial中的方法,当我检查方法时,我得到了我想要的对象,然后如果我尝试访问对象的名称,它失败。

在局部内部,通过工作调用&#34;检查&#34;:

<%= list.substitute_item.inspect %>

成功通话检查输出:

#<Item id: 1, name: "Item 1", created_at: "2014-05-20 18:20:20", updated_at: "2014-05-20 18:20:20">

在部分内部,对项目名称的调用中断:

<%= list.substitute_item.name %>

获取NilClass错误:

undefined method `name' for nil:NilClass

我在这里缺少什么?是否有不同的方法来调用find方法,该方法将创建我想要的Item对象的可用实例?我想将此方法保留在模型中,但如果它只能在控制器中工作,我可以移动它。

我尝试在视图中使用实例变量(部分),结果相同:

# Successful call to inspect
<% @substitute = list.substitute_item %>
<%= @substitute.inspect %>

# Failed call to name
<% @substitute = list.substitute_item %>
<%= @substitute.name %>

1 个答案:

答案 0 :(得分:1)

  

那么这个问题可以简化为控制台示例吗?说...   Item.find(1).inspect有效,但Item.find(1).name不起作用?

不会重现结果,因为它是一个不同的设置

问题是代码试图通过ActiveRecord调用instance method对象。该方法将是自包含的(如何在不支持它的方法上调用链式命令?)

我不知道我说的是否正确(我必须研究如何创建AR对象等),但你应该试试这个:

def substitute_item
    Item.find(1).name
end

这将仅返回 name查询的Item.find(1)属性,该属性应允许您在视图中输出item.list_substitute。如果这有效,我相信我的假设会有实质内容;如果没有,它会回到绘图板上:))


类对象

我不知道这个的正确术语,但我希望它能给你一些想法:

-

实例方法

您在对象上调用instance method以加载另一个对象。我让你尝试使用实例方法作为填充对象的方法,但这只会用对象填充该方法;意味着使用.name等不起作用

-

<强>对象

在阅读了一些Ruby docs后,您将能够看到它的面向对象。我相信你的答案是找出如何将一个对象链接到另一个对象

如果你愿意,我可以阅读如何做到这一点。我也会问一些Ruby人员如何做到这一点

-

<强>修正

也许进入聊天会话会帮助我们找到可行的解决方案吗?