我需要获取一些有关在 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。我需要在同一个“创建”操作中从 params 创建这两个对象,因为我有相同的表单来为其输入数据(params[:club]
和 params[:俱乐部][:地点]
)。我不知道应该如何保存这个对象,因为为了构建一个地方(@club.build_place(params[:club][:place])
)我应该将@club保存在数据库中。请给我解决我的问题的代码示例。提前致谢。
最佳答案
如果您要从单个表单创建多个对象,您可能最好将此逻辑放入“表单对象”中...请参阅 CodeClimate 博客中的文章“重构 Fat ActiveRecord 模型的 7 种模式”此处(查找有关提取表单对象的第 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
这为您提供了更多的控制权和更清晰的界面。
关于ruby-on-rails - 在 Rails 中创建 2 个具有 has_one 关联的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102973/