#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