2012-04-12 3 views
12

Я хочу конкретно установить поле, когда пользователь создан. У меня естьПереопределение метода регистрации регистрации Создать метод

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

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

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

+2

Planetpluto, вы должны добавить свой собственный ответ для использования 'resource' и пометить его как ответ, как вы указали в своем комментарии Puneeth. Это гораздо лучшее и более простое решение. – Jeff

ответ

39

Для будущей ссылки для тех, кто считает это при поиске, как переопределить разработки методов, большинство из Разрабатывает методы принимают блок, так что-то, как это должно работать, а также:

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super do 
     resource.tag_list = params[:tags] 
     resource.save 
    end 
    end 
end 
+0

это не сработало для меня (Rails 3.2), я переключился на старый супер, затем мои инструкции – OWZY

+0

Работал на Rails 5.1. –

10

Вместо использования super для вызова создания действия в DEViSE :: RegistrationsController, в заменить его actual code of Devise::RegistrationsController's create method

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 
+1

Спасибо, это работает отлично. Я попытаюсь использовать супер и под ним, а не @ user.tag_list resource.tag_list, чтобы увидеть, работает ли это тоже. – Vasseurth

+0

Извините за пересмотр такой старой темы, но Puneeth, можете ли вы объяснить, почему было бы лучше вставить фактический код из метода создания Devise, в отличие от использования 'super'? – jeffdill2

+0

@streetlogics ответ лучше решает этот вопрос. Конструкция, создающая супер, имеет эту строку «ресурс yield, если block_given?» который будет оценивать блок, добавленный в его примере. – blnc

6

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

protected 

# Called before resource.save 
def build_resource(hash=nil) 
    super(hash) 
    resource.tag_list = params[:tags] 
end 
+0

Это работало для меня в Rails 4 w/Devise 3.5. Спасибо!!!!!! – cman77

+1

Если бы проблема с принятым ответом вызывала мою проверку дважды, и этот подход привел к новому подходу к моей реализации, спасибо. – ollaollu

Смежные вопросы