【问题标题】:Rails Namespaced HelperRails 命名空间助手
【发布时间】:2013-12-06 15:27:21
【问题描述】:

我在 app/controllers/api/v1 中有一个控制器 Api::V1::UsersController。 我在 app/helpers/api/v1 中有一个辅助模块 Api::V1::ErrorHelper

我想访问控制器内的辅助模块的方法。所以,我调用了控制器的辅助方法,将模块传递给它:

class Api::V1::UsersController < ApplicationController

  helper Api::V1::ErrorHelper

  #other code
end

但是当我访问控制器内部的一个辅助方法 (respond_with_error) 时,我得到以下异常:

undefined method `respond_with_error' for #<Api::V1::UsersController:0x007fad1b189578>

如何从控制器访问此帮助程序?

(我使用的是 Rails 3.2)

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby helper


    【解决方案1】:

    助手混合在视图中,而不是在控制器中。例如,如果您有以下帮助程序

    module Authentication
      def current_user
        # ...
      end
    end
    

    然后你将它包含在任何控制器中

    helper Authentication
    

    从操作中调用 current_user 将引发未定义的方法错误。

    如果你想让视图和控制器可以使用一些方法,你需要一种不同的方法。定义方法并将模块包含为普通模块。

    class MyController < ApplicationController
      include Authentication
    end
    

    并使这些方法可用作帮助程序。

    class MyController < ApplicationController
      include Authentication
    
      helper_method :current_user
    end
    

    您还可以利用included 挂钩。

    class MyController < ApplicationController
      include Authentication
    end
    
    module Authentication
      def self.included(base)
        base.include Helpers
        base.helper  Helpers
      end
    
      module Helpers
        def current_user
        end
      end
    end
    

    【讨论】:

      【解决方案2】:

      helper 在您的视图中包含该模块,要将其包含在您的控制器中,只需“包含 Api::V1::ErrorHelper”。

      但是在控制器中包含视图助手不是一个好主意,你应该把它放在其他地方(你的 lib 目录,也许)并且不要称它为助手,因为它不是视图助手,而是控制器助手。

      【讨论】:

        猜你喜欢
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多