我需要获得一些有关在Rails中通过验证创建新对象的信息。例如,有以下代码:
def create
@user = User.new(params[:user])
if @user.save
# some actions: redirect, render, etc
else
render 'new'
end
end
但是如果有2个带有has_one关联的模型,例如Club和Place。我需要在同一个'create'操作中从params创建这两个对象,因为我有相同的表单来输入数据(params[:club]
和params[:club][:place]
)。我不知道应该如何保存这些对象,因为为了构建一个地方(@club.build_place(params[:club][:place])
),我应该将@club保存在数据库中。请给我举例说明我的问题代码。提前致谢。
答案 0 :(得分:3)
如果您要从单个表单创建多个对象,最好将此逻辑放入“表单对象”中...请参阅CodeClimate博客中的文章“7个重构Fat ActiveRecord模型的模式”在这里(查找关于提取表单对象的第3节):http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models。
Railscasts在表单对象上也有很好的插曲,虽然它是“专业剧集”(即需要订阅)。 http://railscasts.com/episodes/416-form-objects
简而言之,您创建一个自定义模型,包括一些必要的ActiveModel模块,然后创建一个自定义保存方法,例如(这直接来自有很多好建议的文章。)
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
这为您提供了更多控制和更清晰的界面。