Ruby on rails 4 自定义字段设计
我的DesiveRuby on rails 4 自定义字段设计,ruby-on-rails-4,devise,Ruby On Rails 4,Devise,我的Desive用户模型与我的组织模型之间有一个参考 如果组织名称不存在,我希望能够使用用户在注册页面中输入的任何名称创建组织。但是,如果用户输入现有组织的名称,我只需要将引用分配给该用户的模型 正如我所说,我已经创建了迁移,我知道如何将该字段添加到我的注册页面的视图中,但我不确定如何让Deave有条件地创建组织,或者在用户注册时仅添加对该组织的引用。您需要做的是自定义Deave注册,请执行以下操作 生成注册码 $ rails generate devise:controllers users
用户
模型与我的组织
模型之间有一个参考
如果组织名称不存在,我希望能够使用用户在注册页面中输入的任何名称创建组织。但是,如果用户输入现有组织的名称,我只需要将引用分配给该用户的模型
正如我所说,我已经创建了迁移,我知道如何将该字段添加到我的注册页面的视图中,但我不确定如何让Deave有条件地创建组织,或者在用户注册时仅添加对该组织的引用。您需要做的是自定义Deave注册,请执行以下操作 生成注册码
$ rails generate devise:controllers users registrations
$ rails generate devise:views users registrations
添加到routes.rb
devise_for :users, controllers: {
registrations: "users/registrations"
}
我假设您知道如何将名为organization的嵌套属性添加到注册表单中。无论如何,如果您使用Railsform_作为
,它是这样的
<%= 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