我的Devise User
模型引用了Organisation
模型。
如果组织名称不存在,我希望能够创建用户在注册页面中输入的任何名称的组织。但是,如果用户输入现有的Organisiation的名称,我只需要为该用户的模型分配引用。
正如我所说的,我已经创建了迁移,并且我知道如何将该字段添加到我的注册页面的视图中,但我不知道如何设计有条件地创建组织或只是添加对它的引用用户注册。
答案 0 :(得分:3)
对于后人来说,这就是我的registrations_controller.rb
最终(或左右)的样子:
class Users::RegistrationsController < Devise::RegistrationsController
# POST /resource
def create
super do |resource|
resource.organization = Organization.find_or_create_by(:organization_name => params[:user][:organization_attributes][:organization_name])
end
end
end
按照Hoa的建议使用before_filter
让Devise尝试创建新的组织,导致重复。我为Organization
模型添加了唯一性验证,该模型仅停止了对已有组织的新注册。这个解决方案会在Devise的create方法中暴露出来的块(参见here)。这真的有助于#34;去源#34;。
答案 1 :(得分:1)
您需要做的是自定义设计注册,执行以下操作
生成注册码
$ rails generate devise:controllers users registrations
$ rails generate devise:views users registrations
添加到routes.rb
devise_for :users, controllers: {
registrations: "users/registrations"
}
我假设您知道如何在注册表单中添加名为organization的嵌套属性。无论如何,如果你使用Rails form_for
,它就是这样的
<%= f.fields_for :organization, Organization.new do |org_fields| %>
<%= org_fields.text_field :name %>
<% end %>
在users/registrations_controller.rb
中,应用以下更新
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_sign_up_params, only: [:create]
# POST /resource
def create
super
resource.organization = Organization.find_or_create_by(name: sign_up_params[:organization_attributes][:name])
end
protected
def configure_sign_up_params
devise_parameter_sanitizer.for(:sign_up) << [ organization_attributes: [ :name ] ]
end
...
end
如果您有任何问题,请与我们联系。