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
каталог, может быть) и не называть его помощником, так как это не помощник вида, а помощник контроллера.