自定义字段设计

时间:2014-11-19 09:40:55

标签: ruby-on-rails-4 devise

我的Devise User模型引用了Organisation模型。

如果组织名称不存在,我希望能够创建用户在注册页面中输入的任何名称的组织。但是,如果用户输入现有的Organisiation的名称,我只需要为该用户的模型分配引用。

正如我所说的,我已经创建了迁移,并且我知道如何将该字段添加到我的注册页面的视图中,但我不知道如何设计有条件地创建组织或只是添加对它的引用用户注册。

2 个答案:

答案 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

如果您有任何问题,请与我们联系。