Ruby on 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

我需要获得一些关于在Rails中创建新对象并进行验证的信息。例如,有以下代码:

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