从视图中调用模型中的方法
Posted
技术标签:
【中文标题】从视图中调用模型中的方法【英文标题】:calling a method in model from view 【发布时间】:2012-02-01 01:49:54 【问题描述】:我正在尝试根据之前是否查看过某个项目、新的 cmets 等来评估需要在项目旁边显示哪个指标。在我决定要使用的符号之前,我只想显示一个数字。
在我的报告模型中
def self.indicator
#bunch of if elsif statements returning a number 0-3
end
在我看来我有
<% @reports.each do |report| %>
<%= report.indicator %>
<% end %>
我收到undefined method 'indicator'
我以为我掌握了方法的工作原理……但显然没有,我做错了什么?
【问题讨论】:
请显示完整的错误信息。它是包含一个类/对象还是 nil 上的未定义方法? 另外请显示执行@reports = Report.all 或 Report.find(...) 等视图的控制器语句。 【参考方案1】:试试
def indicator
#bunch of if elsif statements returning a number 0-3
end
您不需要 self 因为它 [更正为] 是一个类级别的方法。
【讨论】:
你能告诉我们在视图中调用模型方法是否可以,因为我们以这种方式跳过了控制器?另外,如果这是一个不好的做法,还有什么替代方法?【参考方案2】:在您看来,您正在对每个报表对象调用实例方法indicator
report.indicator
但是在您的模型中,您已经定义了一个类方法。因此,要使其正常工作,请将您的指标方法也定义为实例方法:
def indicator
#bunch of if elsif statements returning a number 0-3
end
【讨论】:
【参考方案3】:您的迭代变量report
用于遍历@reports
的每个实例。使用self.indicator
,您正在声明一个类方法(通过self.name
)。这样就可以调用Report.indicator
。您想要的只是在单个 Report 实例上调用,因此您可以像这样在模型中定义方法指示器:
def indicator
#bunch of if elsif statements returning a number 0-3
end
现在应该可以了!
【讨论】:
以上是关于从视图中调用模型中的方法的主要内容,如果未能解决你的问题,请参考以下文章