如何在关联的视图文件中调用控制器方法?

时间:2014-09-25 17:24:27

标签: ruby-on-rails

我正在尝试在控制器文件中创建一个方法,然后在index.html.erb视图文件中调用该方法。

以下是我的索引操作和控制器文件中的自定义方法:

def index
  @mustdos = current_user.mustdos
end

def calculates_mustdos_days_left
  ((mustdo.created_at + 7.days - Time.now) / ( 60 * 60 * 24)).round
end
helper_method :calculates_mustdos_days_left

以下是我关联的index.html.erb文件中的相关代码:

<% @mustdos.each do |mustdo| %>
  <tr id="todo-<%= "#{mustdo.id}" %>">
    <td><%= calculates_mustdos_days_left %></td>
  </tr>
<% end %>

我收到此错误:

NameError in Mustdos#index

它正在引用我的index.html.erb视图文件

中的这一行
<td><%= calculates_mustdos_days_left %></td>

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

3 个答案:

答案 0 :(得分:2)

一般情况下,当我需要它们为视图生成内容/输出时,我会尝试保留辅助方法。当我想计算并返回有关特定Model实例的数据时,我要么将该代码添加到Service或模型本身。

app / models / must_do.rb

def days_left
  ((self.created_at + 7.days - Time.now) / ( 60 * 60 * 24)).round
end

然后,在我看来,很容易从模型的实例中访问它:

<% @mustdos.each do |mustdo| %>
  <tr id="todo-<%= "#{mustdo.id}" %>">
    <td><%= mustdo.days_left %></td>
  </tr>
<% end %>

对我来说,这是对所需行为的更清晰的实现。希望将其作为@ IS04答案的替代/补充方法。

答案 1 :(得分:1)

你可以尝试:

helper_method def calculates_mustdos_days_left(mustdo)
  ((mustdo.created_at + 7.days - Time.now) / ( 60 * 60 * 24)).round
end

然后在您的视图文件中:

<% @mustdos.each do |mustdo| %>
  <tr id="todo-<%= "#{mustdo.id}" %>">
    <td><%= calculates_mustdos_days_left(mustdo) %></td>
  </tr>
<% end %>

但您应该使用helper方法控制器方法,如果您的方法更通用(与模型相关)并且不依赖于视图,您可以在model中定义它正如@ craig.kaminsky写的那样

答案 2 :(得分:0)

你无法做到。您无法在视图中调用控制器操作之外的方法。如果你有一个像这样的逻辑,你应该真正尝试将它变成一个模型。在这种情况下,我会将此方法放在mustdo模型中。

但是在那些将逻辑放入模型中没有意义的情况下,您可以使用帮助程序命名空间。对于那些不适合任何地方的方法,如显示逻辑,它就是一种杂项抽屉。助手进入app/helpers/目录。默认情况下,有一个名为application_helper.rb的帮助程序命名空间文件。您放入的任何方法都将在您的所有控制器和视图中可用。