Придумайте: где поставить логику без переопределения контроллера регистрации - PullRequest
0 голосов
/ 21 октября 2011

После создания пользователя с помощью Devise я хочу, чтобы происходили разные вещи (например, создание учетной записи и ее поля, заполненные различными значениями, поля в таблице транзакций, которые необходимо обновить, и т. Д.).Я попытался «расширить» контроллер регистрации Devise

class MyRegistrationsController < Devise::RegistrationsController
  prepend_view_path "app/views/devise"

  def create
     super
     # Generate your profile here
     @account = Account.new
     @account.user = current_user.id
  end  
end

Однако, когда я использую это, devise прекращает перенаправление, проверку ошибок и т. Д. Моей следующей мыслью было сделать следующее в моем User.model

after_create :build_user_account

def build_user_account
  @account = Account.new
  @account.user = current_user.id
end

Но я читал, что этот код не должен быть в модели, и у меня нет доступа к current_user в модели.Я знаю, что это любительские вещи, но я в тупике.Должен ли я сделать свою собственную аутентификацию и извлечь Devise, или есть способ кодировать это правильно, все еще используя Devise?

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

Я думаю, что эта бизнес-логика (каждый объект пользователя должен иметь учетную запись) подходит для модели.

Вы можете использовать наблюдателя для этого или использовать обратный вызов after_create, как вы это сделали.Использование обратного вызова:

after_create :create_user_account

def create_user_account
  Account.create(:user_id => self.id)
end
0 голосов
/ 21 октября 2011

В вашем пользовательском контроллере регистрации вы звоните супер, а затем передаёте логику создания аккаунта. Если я не ошибаюсь, вызов super говорит, что он запускает только код в контроллере Devise и игнорирует ваш код (я должен был бы вернуться через код контроллера, чтобы убедиться). Я попытался бы скопировать метод как есть из контроллера Devise, который вы можете найти на Github , и затем передать свою логику. Это должно позволить всему работать так, как вы хотите, и при этом иметь соответствующие перенаправления и проверки.

Если вы решите сделать это вне пользовательского контроллера регистрации и поместить его в модель, вам придется использовать хук after_create, как указано @Jesse Wolgamott, чтобы у вас был доступ к методу current_user. Хотя это может быть не «путь Rails» для помещения бизнес-логики в модель, это просто иногда неизбежно.

0 голосов
/ 21 октября 2011

Команда разработчиков рекомендует не использовать devise, если вы новичок ;-) Тем не менее, я думаю, что devise достаточно стабильный и достаточно зрелый, чтобы его можно было использовать вместо полностью индивидуального решения.

Одна вещь, даcurrent_user не доступен в модели (я думаю).Что я делаю, так это в моем контроллере:

  # POST /reports
  # POST /reports.json
  def create
    @report = Report.new(params[:report])
        @report[:user_id] = current_user[:id]
    @report[:name_seo] = @report[:name].to_slug

Хотя это немного не по теме, я нашел эту статью полезной: http://www.communityguides.eu/articles/11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...