在许多视图中放置代码的位置

时间:2014-07-26 18:07:51

标签: ruby-on-rails ruby-on-rails-4

目前,我在 _header.html.erb 部分中使用了这段代码,该代码由 application.html.erb 使用。

<% current_user.achievements.each do |achievement| %>
  <li><%= link_to achievement.header_string, polymorphic_path(achievement.achievementable) %></li>
<% end %>

current_user.achievements 似乎更适合放入控制器?但我不知道在哪里放,它类似于Stack Overflow上标题中的成就。如果用户已登录,则此代码将用于所有视图。

3 个答案:

答案 0 :(得分:1)

我会使用辅助方法将它放在应用程序控制器中。

helper_method :achievements

def acheivements(current_user)
  current_user.achievements.each do |achievement| 
   <do stuff>
end

然后您可以从任何地方调用它,因为所有控制器都从应用程序控制器继承。

答案 1 :(得分:1)

我在您的观看中使用current_user.achievements时看不到任何错误,因为会调用当前用户成就一次,然后导致caches that query导致您

如果你真的想把它放在某个地方那么应用程序控制器就是的地方

def achievements
  @acheivements = current_user.achievements
end

然后在过滤之前使用你要设置的任何动作

before_filter :achievements, only: [:your_methods]

答案 2 :(得分:1)

TL; DR保持原样

实际上你的问题可以用两种方式回答:

  1. 如果您指的是视图代码(即构建列表),那么这就是部分意图。通过将它放在_header部分,你就做对了。

  2. 如果您指的是current_user.achievements的调用,并且您认为该视图是触发数据库调用的错误位置,我会说:是和否。这是严格的MVC逻辑不那么严格的地方。对于这种情况,我永远不会使用过滤器方法或实例变量来混淆我的控制器。在我看来,让视图决定对象的哪些属性以及可能需要显示哪些相关对象是完全正确的。控制器参与该故事可以涵盖诸如现场级别的访问控制之类的内容(通过在未经证实的情况下将成就设置为[])。我还认为你的版本是一个很好的,可读的和明确的代码。