Разработка: куда поместить логику без переопределения контроллера регистрации

#ruby-on-rails #devise

#ruby-on-rails #разработка

Вопрос:

После создания пользователя с помощью 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
 

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

 after_create :build_user_account

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

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

Ответ №1:

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

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

 after_create :create_user_account

def create_user_account
  Account.create(:user_id => self.id)
end
 

Ответ №2:

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

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

Ответ №3:

Команда разработчиков рекомендует не использовать 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