Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在何处放置在许多视图上使用的代码_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在何处放置在许多视图上使用的代码

Ruby on rails 在何处放置在许多视图上使用的代码,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,目前,我的\u header.html.erb部分中有这段代码,由application.html.erb使用 <% current_user.achievements.each do |achievement| %> <li><%= link_to achievement.header_string, polymorphic_path(achievement.achievementable) %></li> <% end %>

目前,我的\u header.html.erb部分中有这段代码,由application.html.erb使用

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


  • 当前用户的成就似乎更适合放在控制器中?但我不知道该把它放在哪里,这与这里标题中关于堆栈溢出的成就类似。如果用户登录,此代码将在所有视图中使用。

    我将使用助手方法将其放入应用程序控制器中

    helper_method :achievements
    
    def acheivements(current_user)
      current_user.achievements.each do |achievement| 
       <do stuff>
    end
    
    helper\u方法:成就
    定义成就(当前用户)
    当前|u user.aggregations.each do|acgregation|
    结束
    
    然后,您可以从任何地方调用它,因为您的所有控制器都继承自应用程序控制器

    我认为使用
    当前用户没有任何错误。在您的视图中,成就
    ,因为它将调用当前用户的成就一次,然后rails为您生成结果

    <% current_user.achievements.each do |achievement| %>
      <li><%= link_to achievement.header_string, polymorphic_path(achievement.achievementable) %></li>
    <% end %>
    
    如果您真的想把它放在某个地方,那么应用程序控制器就是您想要的地方

    然后在您希望设置的任何操作上使用before filter

    before_filter :achievements, only: [:your_methods]
    

    TL;让它保持原样

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

  • 如果您引用的是视图代码(即构建列表),那么这就是partials的含义。把它放在_头部分,你做了正确的事情

  • 如果您指的是当前用户的调用。如果您觉得视图是触发数据库调用的错误位置,我会说:是和否。这就是严格的MVC逻辑不那么严格的地方。在这种情况下,我决不会用过滤器方法或实例变量将控制器弄得乱七八糟。在我看来,让视图决定对象的哪些属性以及需要显示哪些相关对象是完全可以的。在这个故事中,一个控制器的参与可以涵盖一些类似于现场级别的访问控制(在非auhorized的情况下,通过将成就设置为[])。我还认为您的版本是好的、可读的和明确的代码