Ruby on rails 4 自定义字段设计

Ruby on rails 4 自定义字段设计,ruby-on-rails-4,devise,Ruby On Rails 4,Devise,我的Desive用户模型与我的组织模型之间有一个参考 如果组织名称不存在,我希望能够使用用户在注册页面中输入的任何名称创建组织。但是,如果用户输入现有组织的名称,我只需要将引用分配给该用户的模型 正如我所说,我已经创建了迁移,我知道如何将该字段添加到我的注册页面的视图中,但我不确定如何让Deave有条件地创建组织,或者在用户注册时仅添加对该组织的引用。您需要做的是自定义Deave注册,请执行以下操作 生成注册码 $ rails generate devise:controllers users

我的Desive
用户
模型与我的
组织
模型之间有一个参考

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


正如我所说,我已经创建了迁移,我知道如何将该字段添加到我的注册页面的视图中,但我不确定如何让Deave有条件地创建组织,或者在用户注册时仅添加对该组织的引用。

您需要做的是自定义Deave注册,请执行以下操作

生成注册码

$ rails generate devise:controllers users registrations
$ rails generate devise:views users registrations
添加到
routes.rb

devise_for :users, controllers: {
  registrations: "users/registrations"
}
我假设您知道如何将名为organization的嵌套属性添加到注册表单中。无论如何,如果您使用Rails
form_作为
,它是这样的

<%= f.fields_for :organization, Organization.new do |org_fields| %>
  <%= org_fields.text_field :name %>
<% end %>

如果您有任何问题,请告诉我。

对于子孙后代,这就是我的
注册\u controller.rb
最终的样子(或大约):

类用户::注册控制器<设计::注册控制器
#员额/资源
def创建
超级do |资源|
resource.organization=organization.find_或create_by(:organization_name=>params[:user][:organization_attributes][:organization_name])
终止
终止
终止

按照Hoa的建议,在筛选之前使用
,使Desive尝试创建新的组织,从而导致重复。我在
组织
模型中添加了一个唯一性验证,它只停止了对现有组织的新注册。此解决方案跳转到DeVICE的创建方法中公开的块上(请参阅)。“转到源代码”确实很有帮助。

您的用户模型和组织模型之间的关系是什么
User
有一个组织:参考字段<代码>组织有许多
用户
s,每个
用户
都属于一个
组织
。组织理论上不需要用户,但用户需要与组织相关联。这看起来很棒,我现在不在,但我会接受并让你知道。谢谢<代码>组织。查找或创建通过在我的程序中不断创建新组织(从不返回现有组织)。如果我在rails控制台中使用
find\u或
create\u by,它会按预期工作。知道为什么会这样吗?@j3frea你的注册控制器#create是什么样子的吗?我在users/registrations\u controller.rb中的所有内容都是你在这里给我的,所以在
create
中它只是
super
find\u或\u create\u by
行-它正在用正确的名称创建一个新的组织(没有奇怪的字符或任何东西)但显然它应该找到现有的一个。我解决了问题,请参阅下面的答案。谢谢。
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
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