我正在尝试在控制器文件中创建一个方法,然后在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>
我该如何解决这个问题?感谢。
答案 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
的帮助程序命名空间文件。您放入的任何方法都将在您的所有控制器和视图中可用。