【问题标题】:How to call a controller method in an associated view file?如何在关联的视图文件中调用控制器方法?
【发布时间】:2023-04-05 01:38:01
【问题描述】:

我试图在控制器文件中创建一个方法,然后在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>

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

【问题讨论】:

  • 显示控制器Mustdos..
  • 方法 calculates_mustdos_days_left 中的 mustdo 变量来自哪里?
  • @Зелёный mustdo 可能 OP 定义为 getter... 可能是,我不确定!

标签: ruby-on-rails


【解决方案1】:

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

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 答案的替代/附加方法。

【讨论】:

  • 这是完美的。我尝试了这个版本,但它不起作用。通过查看您的代码,我得到了mustdo.created_at 而不是self.created_at。现在正在工作。谢谢大家!
  • 甜蜜:)!很高兴你让它摇摆不定!
【解决方案2】:

你可以试试:

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 方法,如果你的方法更通用(与模型相关)并且不依赖于视图,你可以在@craig.kaminsky 写的model 中定义它

【讨论】:

  • 我将方法放在applcation_helper.rb 文件中,并为要传递给方法的参数添加了一个点,现在它可以工作了。谢谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多