【问题标题】:Where to put code thats used on many views在哪里放置用于许多视图的代码
【发布时间】:2014-07-26 18:07:51
【问题描述】:

目前,我的 _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 上标题中的成就。如果用户已登录,此代码将在所有视图中使用。

【问题讨论】:

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


    【解决方案1】:

    我认为在您的视图中使用 current_user.achievements 没有任何问题,因为它会调用当前用户的成就一次,然后为您跟踪 caches that query 结果

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

    def achievements
      @acheivements = current_user.achievements
    end
    

    然后在您想要设置的任何操作上使用 before 过滤器

    before_filter :achievements, only: [:your_methods]
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        TL;DR 保持原样

        其实你的问题可以通过两种方式来回答:

        1. 如果您指的是视图代码(即构建列表),那么这就是部分的含义。通过将它放在 _header 部分中,您可以做正确的事情。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-31
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-15
          • 1970-01-01
          • 2016-01-08
          相关资源
          最近更新 更多