17

我想在创建用户时专门设置一个字段。我有

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

我有传递标签参数的复选框,并且我在服务器日志中验证了标签参数正在传递。但是,当我在控制台中调用 @user.tag_list 时,我只会得到一个空白响应[]

我觉得问题在于我对设计的创建方法的操作。我没有在任何地方明确设置@user,但不确定如何使用设计进行设置。有谁知道在使用设计时如何设置特定字段?

4

3 回答 3

52

对于在搜索如何覆盖设计方法时发现此问题的任何人的未来参考,大多数设计方法都接受一个块,因此类似这样的东西也应该可以工作:

class RegistrationsController < Devise::RegistrationsController
  def create
    super do
        resource.tag_list = params[:tags]
        resource.save
    end
  end
end
于 2014-10-27T19:56:18.787 回答
12

不要使用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
于 2012-04-12T06:16:24.213 回答
8

如果不想重写 create 方法的整个代码,可以简单地在Devise::RegistrationsController的受保护方法:build_resource中设置资源变量,该方法在资源保存之前调用。

protected 

# Called before resource.save
def build_resource(hash=nil)
  super(hash)
  resource.tag_list = params[:tags]
end
于 2016-08-18T20:59:04.283 回答