【问题标题】:Where to put Ruby helper methods for Rails controllers?在哪里放置 Rails 控制器的 Ruby 辅助方法?
【发布时间】:2012-11-16 18:50:45
【问题描述】:

我有某些(或所有)控制器需要的 Ruby 方法。我尝试将它们放入/app/helpers/application_helper.rb。我已将其用于视图中使用的方法。但是控制器看不到这些方法。我应该把它们放在其他地方还是我需要以不同的方式访问这些辅助方法?

使用最新的稳定 Rails。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 view-helpers


    【解决方案1】:

    你应该在ApplicationController中定义方法。

    【讨论】:

    • 他还必须在 ApplicationController 中添加 helper_method :my_helper_method 以使其可用于视图。
    • 随着时间的推移,这不会导致控制器变胖吗?
    • 还有违反 MVC 的@David
    【解决方案2】:

    从 Rails 4 开始,关注点是要走的路。有一篇不错的文章仍然可以通过 Wayback Machine 发送到viewed

    本质上,如果您查看控制器文件夹,您应该会看到关注子文件夹。按照这些思路在其中创建一个模块

    module EventsHelper
      def do_something
      end
    end
    

    然后,在控制器中包含它

    class BadgeController < ApplicationController
      include EventsHelper
    
      ...
    end
    

    【讨论】:

    • 当您不需要所有控制器中包含的辅助方法时,我发现这是最好的解决方案。此解决方案也适用于模型。
    • 不错。谢谢你:)
    • 你知道我们是否需要在控制器问题上使用extend ActiveSupport::Concern
    • 无需在控制器/关注目录中扩展 ActiveSupport::Concern。您只需要在目录上方定义模块,并且可以像上面提到的那样简单地包含(对于 rails 4.2 和 rails 5)。
    • 可能是最好的答案
    【解决方案3】:

    您应该在应用程序控制器中定义方法,如果您的方法很少,那么您可以按照以下方式进行操作

    class ApplicationController < ActionController::Base    
      helper_method :first_method
      helper_method :second_method
    
      def first_method
        ... #your code
      end
    
      def second_method
        ... #your code
      end
    end
    

    您还可以包含以下帮助文件

    class YourController < ApplicationController
      include OneHelper
      include TwoHelper
    end
    

    【讨论】:

    • 有没有办法将所有 helper_methods 分配在一行上?
    • @HarshaMV 我认为您可以像helper_method :first_method, :second_method 一样继续前进。
    【解决方案4】:

    您可以使用 view_context 从控制器调用任何辅助方法,例如

    view_context.my_helper_method
    

    【讨论】:

      【解决方案5】:

      Ryan Bigg 的反应很好。

      其他可能的解决方案是将助手添加到您的控制器:

      class YourController < ApplicationController
        include OneHelper
        include TwoHelper
       end
      

      最好的问候!

      【讨论】:

        【解决方案6】:

        在控制器中包含帮助器最终会将帮助器方法公开为操作!

        # With new rails (>= 5) 
        
        helpers.my_helper_method
        
        
        # For console
        
        helper.my_helper_method
        

        【讨论】: