我为Devise创建了一个自定义注册控制器。我在表单中插入了一个参数,表示如果确实如此,我应该在注册后做一些额外的事情,例如,为用户创建一个相关的公司。
class RegistrationsController < Devise::RegistrationsController
before_filter :authenticate_user!, :only => :token
def new
super
end
def create
super
reg_type = params['reg_type']
if reg_type=='1'
current_user.create_default_company!
end
end
def update
super
end
end
但是,我的current_user现在没有了。
undefined method `create_default_company!' for nil:NilClass
在调用super之后,我可以使用什么来立即引用current_user,这会创建用户。
参数:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"E1urosfkmekwweklo/HZaEVrrmxQVKO9E=", "user"=>{"name"=>"", "email"=>"4@Gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up", "reg_type"=>"1"}
我使用两个链接传递参数:
new_user_registration_path(reg_type: '0')
new_user_registration_path(reg_type: '1')
创建的操作取决于用户选择的链接。
答案 0 :(得分:1)
如果你打开devise gem,你会发现创建方法为
(设计-3.2.4)
def create
build_resource(sign_up_params)
if resource.save
yield resource if block_given?
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_flashing_format?
sign_up(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_flashing_format?
expire_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
end
您应首先检查您正在使用的设备版本,然后您可以在控制器中覆盖该方法。
简而言之,使用资源而不是current_user可以解决您的问题,但它可能会生成不适当的结果,因为您只会在渲染模板后分配属性(而不是保存)。
答案 1 :(得分:1)
您应该可以通过将块传递给super
来访问新用户:
def create
super do |resource|
if params['reg_type'] == "1"
resource.create_default_company!
end
end
end
在docs&#34;配置控制器&#34;下解释了这一点(好吧,至少提到)。
可以通过块参数resource
访问新用户,但此时可能无法保存。
答案 2 :(得分:1)
您可以在reg_type
回调中查看此after_create
参数,然后创建默认公司(如果它等于'1'
。
答案 3 :(得分:0)
首先,感谢您的所有评论。我的解决方案是使用andrey deineko建议和after_create回调。我添加了一个attr_accessor来引用权限,我将其作为隐藏字段添加到表单中。
我用过..
class User < ActiveRecord::Base
attr_accessor :reg_type
after_create :create_default_company!, if: :is_reg?
def is_reg?
@reg_type == '1'
end
...
end
似乎运作良好。谢谢你提出的所有建议。