Rails Namespaced Helper

时间:2013-11-21 22:21:12

标签: ruby-on-rails ruby helper

我在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)

感谢。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

helper在您的视图中包含该模块,将其包含在您的控制器中,只包括'include Api :: V1 :: ErrorHelper`。

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