Ruby on rails rails自动完成如何使用现有记录
我是rails新手,我对嵌套表单和所有这些都有问题。 我有一个用户模型和一个组织模型。 当我想创建一个用户时,我想指定他来自哪个组织。 组织名称已经在数据库中,或者如果没有,我想创建一个新记录并将该记录与用户模型相关联 我很难理解rails框架中的所有关系(多对多等),但到目前为止我已经了解了这一点 模型/组织。rbRuby on rails rails自动完成如何使用现有记录,ruby-on-rails,ruby,nested-forms,model-associations,Ruby On Rails,Ruby,Nested Forms,Model Associations,我是rails新手,我对嵌套表单和所有这些都有问题。 我有一个用户模型和一个组织模型。 当我想创建一个用户时,我想指定他来自哪个组织。 组织名称已经在数据库中,或者如果没有,我想创建一个新记录并将该记录与用户模型相关联 我很难理解rails框架中的所有关系(多对多等),但到目前为止我已经了解了这一点 模型/组织。rb class Organization < ActiveRecord::Base has_many :user validates_presence_of
class Organization < ActiveRecord::Base
has_many :user
validates_presence_of :name
end
<%= u.fields_for :organization do |o| %>
<%= o.label "Organization" %>
<!-- PUT ORGA -->
<%= o.text_field :name, class:"form-control" %>
<% end %>
它拒绝说他没有找到ID为的用户。。。当Organization.id=3时。。。
我不明白
我想,既然这是一个常见的情况,这应该很容易,但这会扰乱我的头脑
如果有人愿意向我解释,我将非常感激
多谢各位
编辑
我刚刚在控制器中尝试了一些东西,但也不起作用
def create
@user = User.new(user_params) # :user object built from user inputform
org = Organization.find_by(name:user_params[:organization_attributes][:name])
if org
@user.organization.id = org.id
end
if @user.save
# signin the user (token etc)
sign_in @user
flash[:success] = "Registration sucessfull !"
redirect_to @user
else
render 'new'
end
end
+用户\u控制器(强参数)
+form.html.erb
class Organization < ActiveRecord::Base
has_many :user
validates_presence_of :name
end
<%= u.fields_for :organization do |o| %>
<%= o.label "Organization" %>
<!-- PUT ORGA -->
<%= o.text_field :name, class:"form-control" %>
<% end %>
我将为此编写一个自定义方法:
#in User
def organization_name
(org = self.organization) && org.name
end
def organization_name=(name)
if org = Organization.find_by_name(name)
self.organization = org
else
self.organization = Organization.create(:name => name)
end
end
现在,因为您有一个getter和setter方法(即除了=符号之外,还有两个名称相同的方法),所以可以将organization\u name
视为User的属性,并将其放在表单字段中,如
f.input :organization_name
输入将从
@user.organization\u name
获取当前值,并使用新值调用@user.organization\u name=
。首先从模型中删除accepts\u nested\u属性。
然后在控制器中,您应该执行以下操作:
def create
@user = User.new(user_params) # :user object built from user inputform
org = Organization.where(name: user_params[:organization_attributes][:name]).first || Organization.create(name: user_params[:organization_attributes][:name])
@user.organization = org
if @user.save
# signin the user (token etc)
sign_in @user
flash[:success] = "Registration sucessfull !"
redirect_to @user
else
render 'new'
end
end
在你的app/model/user.rb中
def self.create(name, attribute1, ... ,organization)
user = User.new(:name => name, :atr_1 => attribute_1, ....:atr_n => attribute_n)
user.organization = organization
raise "user not created" if !user.save
user
end
在用户_controller.rb中
def create
org = Organization.find params['organization'] #expecting the param to be Organization#id
user = User.create(params['name'], ..., org)
render :json => {:message => "user created"}
end
应该是
在组织中有很多:用户让我试试这个…=)但我已经做了编辑,对我来说,我的解决方案应该是可行的,但它不可行,有一些东西我不明白……试试这个。我只是根据你刚刚发布的控制器代码进行了编辑。眼光好,错过了。首先。这基本上和我在控制器中所做的一样,但在控制台中不起作用。另外,我认为这个解决方案每次都会创建一个新的组织记录,并且只与以前存在的记录相关。。。
def create
org = Organization.find params['organization'] #expecting the param to be Organization#id
user = User.create(params['name'], ..., org)
render :json => {:message => "user created"}
end