Переопределение метода создания регистрации Devise

Я хочу специально установить поле при создании пользователя. я имею

<code>class RegistrationsController < Devise::RegistrationsController
  def create
    super
    @user.tag_list = params[:tags]
  end
end
</code>

У меня есть флажки, которые передают параметр тегов, и я проверил в журналах сервера, что параметр тегов передается. Однако, когда я вызываю @ user.tag_list в консоли, я просто получаю пустой ответ[] .

Я чувствую, что проблема заключается в том, что я манипулирую методом создания устройства. Я нигде явно не установил @user, но не уверен, как установить его с помощью Devise. Кто-нибудь знает, как установить конкретное поле при использовании devise?

 Jeff26 сент. 2013 г., 21:54
Planetpluto, вы должны добавить свой собственный ответ для использованияresource и пометьте это как ответ, как вы упомянули в своем комментарии, Puneeth. Это гораздо лучшее и простое решение.

Ответы на вопрос(3)

Решение Вопроса

кто находит это при поиске переопределения методов devise, большинство методов Devise принимают блок, поэтому что-то вроде этого должно также работать:

class RegistrationsController < Devise::RegistrationsController
  def create
    super do
        resource.tag_list = params[:tags]
        resource.save
    end
  end
end
 17 июл. 2017 г., 15:38
Работал на Rails 5.1.
 04 июн. 2015 г., 20:02
у меня это не сработало (Rails 3.2), я переключился на старую супер, тогда мои инструкции

super чтобы вызвать действие создания Devise :: RegistrationsController, замените его наактуальный код метода создания Devise :: RegistrationsController

build_resource
resource.tag_list = params[:tags]   #******** here resource is user 
if resource.save
  if resource.active_for_authentication?
    set_flash_message :notice, :signed_up if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_up_path_for(resource)
  else
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
    expire_session_data_after_sign_in!
    respond_with resource, :location => after_inactive_sign_up_path_for(resource)
  end
else
  clean_up_passwords resource
  respond_with resource
end
 11 мар. 2015 г., 17:42
Ответ @streetlogics лучше решает этот вопрос. У устройства create super есть эта строка "yield resource if block_given?" это оценит блок, добавленный в его примере.
 Vasseurth15 апр. 2012 г., 22:22
Спасибо, это работает отлично. Я собираюсь попробовать использовать super и under, вместо @ user.tag_list resource.tag_list, чтобы увидеть, работает ли это тоже.
 11 февр. 2015 г., 22:25
Извините за повторное посещение такого старого потока, но Puneeth, можете ли вы объяснить, почему было бы лучше вставить фактический код из метода создания Devise, а не использоватьsuper?

вы можете просто установить переменную ресурса внутри защищенного метода:build_resource изDevise::RegistrationsController, который вызывается перед сохранением ресурса.

protected 

# Called before resource.save
def build_resource(hash=nil)
  super(hash)
  resource.tag_list = params[:tags]
end
 09 апр. 2017 г., 21:35
У меня была проблема с принятым ответом, дважды вызывающая мою проверку, и этот подход принес новый подход к моей реализации, спасибо.
 17 февр. 2017 г., 21:02
Это сработало для меня в Rails 4 с Devise 3.5. Спасибо!!!!!!

Ваш ответ на вопрос