Ruby on rails 在Rails中创建两个具有一个关联的对象
我需要获得一些关于在Rails中创建新对象并进行验证的信息。例如,有以下代码:Ruby on rails 在Rails中创建两个具有一个关联的对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我需要获得一些关于在Rails中创建新对象并进行验证的信息。例如,有以下代码: def create @user = User.new(params[:user]) if @user.save # some actions: redirect, render, etc else render 'new' end end 但如果有两个模型有一个关联,例如俱乐部和场所。我需要在同一个“创建”操作中从params创建这两个对象,因为我有相同的表单为它输入数据(para
def create
@user = User.new(params[:user])
if @user.save
# some actions: redirect, render, etc
else
render 'new'
end
end
但如果有两个模型有一个关联,例如俱乐部和场所。我需要在同一个“创建”操作中从params创建这两个对象,因为我有相同的表单为它输入数据(
params[:club]
和params[:club][:place]
)。我不知道该如何保存这些对象,因为为了创建一个位置(@club.build\u place(params[:club][:place])
),我应该在数据库中保存@club。请给我一个我的问题代码的例子。提前谢谢 如果要从一个表单创建多个对象,最好将此逻辑放到“表单对象”中。。。请参阅此处找到的CodeClimate博客中的文章“重构Fat ActiveRecord模型的7种模式”(请参阅第3节“提取表单对象”):
Railscasts在表单对象方面也有很好的插曲,尽管它是“专业插曲”(即需要订阅)
简言之,您可以创建一个自定义模型,其中包括一些必要的ActiveModel模块,然后创建一个自定义保存方法,例如(这是直接从文章中获得的,其中有很多很好的建议)
这给了您更多的控制和更干净的界面。谢谢,非常好的建议。另外,请告诉我-您的代码示例是否会在模型中添加错误?我想在视图中显示有关错误的信息……是的,通过包含
ActiveModel::Validations
模块,您将获得与ActiveRecord模型相同的验证行为,这将向您的模型添加错误。您可以在视图中显示它。您能告诉我,您能接受\u嵌套的\u属性\u来帮助我完成任务吗?是的,您也可以使用accepts\u嵌套的\u属性\u来帮助我完成任务,但这就是“表单对象”的设计目的。。。只需检查有关疑难解答的所有堆栈溢出问题就可以接受\u嵌套\u属性\u。。。
class Signup
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_reader :user
attr_reader :company
attribute :name, String
attribute :company_name, String
attribute :email, String
validates :email, presence: true
# … more validations …
# Forms are never themselves persisted
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
private
def persist!
@company = Company.create!(name: company_name)
@user = @company.users.create!(name: name, email: email)
end
end