【问题标题】:Can't call instance method from index view无法从索引视图调用实例方法
【发布时间】:2014-07-14 17:09:22
【问题描述】:

我正在尝试从index.html.erb 视图调用我在控制器中定义的方法(实例方法)。

records_controller.rb:

def calc_cell_balance
   4
end

index.html.erb:

<% @records.each do |r| %>
  <%= r.calc_cell_balance %><br>
<% end %>

我收到此错误:

undefined method `calc_cell_balance' for #<Record:0x35d18d8>

我不想让它成为一个类方法,因为它的设计很糟糕。 如果我将方法定义放在record.rb(模型)中,它就可以工作。

我不确定我做错了什么,因为从视图中访问模型是错误的,但这是唯一有效的方法。

我该如何解决这个问题? 谢谢。

【问题讨论】:

  • 你怎么能说它是错误和糟糕的设计?
  • 其实是正确的方式,适合MVC DesignFat Model和Skinny Controller

标签: ruby-on-rails model-view-controller


【解决方案1】:

您在控制器中放置了一个实例方法RecordsController,但您试图在Record 类的实例上调用该方法。这根本没有意义。您的 @records 都是 Record 实例。您必须执行以下操作:

RecordsController.new.calc_cell_balance

但不要那样做!你的控制器只是用来指导需要做的事情,不应该有在控制器实例本身之外调用的方法。

您的方法可能属于Record 模型,或者可能属于帮助程序。从视图中访问模型并没有错。这是人们做的主要事情。如果您真的不想从视图中调用任何方法,您可以尝试收集控制器中的所有信息,如下所示:

@records = Record.all
@records_calc_cell_balance = @records.collect(&:calc_cell_balance)

然后你有并行的数据数组,但这很愚蠢。从视图调用模型方法很好。或者,如果您觉得该方法过于以视图为中心(例如,您可能想要一个方法来告诉您要使用哪个 CSS 类),请将其放入视图助手中,这就是它的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多