我在" 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 %>
答案 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人员如何做到这一点
-
<强>修正强>
也许进入聊天会话会帮助我们找到可行的解决方案吗?