Rails Namespace Helper

У меня есть контроллер Api::V1::UsersController в приложении / контроллеры / API / V1. У меня есть вспомогательный модуль Api::V1::ErrorHelper в приложении / помощники / API / V1.

Я хочу получить доступ к методам вспомогательных модулей внутри контроллера. Итак, я вызвал вспомогательный метод контроллера, передав ему модуль:

class Api::V1::UsersController < ApplicationController

  helper Api::V1::ErrorHelper

  #other code
end

Но когда я получаю доступ к одному из вспомогательных методов (response_with_error) внутри контроллера, я получаю следующее исключение:

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

Как я могу получить доступ к этому помощнику с контроллера?

(Я использую Rails 3.2)

Благодарю.

2 ответа

Решение

Помощники смешиваются в представлении, а не в контроллере. Например, если у вас есть следующий помощник

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

helper включает этот модуль в ваши представления, чтобы включить его в свой контроллер, просто включите Api::V1::ErrorHelper.

Но включение помощников вида в контроллере не очень хорошая идея, вы, вероятно, должны поместить это в другое место (ваш lib каталог, может быть) и не называть его помощником, так как это не помощник вида, а помощник контроллера.

Другие вопросы по тегам