从视图中调用模型中的方法

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

现在应该可以了!

【讨论】:

以上是关于从视图中调用模型中的方法的主要内容,如果未能解决你的问题,请参考以下文章

MVC - 需要从视图调用控制器中的方法

从视图模型 (WPF) 调用视图中的动画

从 codeigniter 中的视图调用模型是不是不好?

在 Yii2 中从视图中调用模型方法

视图模型中的 Firestore 方法未在 SwiftUI onAppear 方法中调用

Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用