以下代码prepopulates a new _form,但在用户保存表单后,它将更新旧的Inspiration
,而不是创建新的Inspiration
。
def new
if params[:inspiration_id]
@inspiration = Inspiration.find(params[:inspiration_id])
@inspiration = current_user.inspirations.build # Is there a way to find and then build?
else
@inspiration = current_user.inspirations.build
end
end
new_inspiration_path(inspiration_id: inspiration.id)
我们如何使用@inspiration
首先Inspiration.find(params[:inspiration_id])
然后使用current_user.inspirations.build
?
答案 0 :(得分:3)
如果找到,您可以在现有记录上使用dup
方法。例如
existing_inspiration = Inspiration.find_by_id params[:inspiration_id]
if existing_inspiration
@inspiration = existing_inspiration.dup
else
@inspiration = current_user.inspirations.build
end
答案 1 :(得分:1)
更新灵感的原因是因为它是一个持久的记录。您可以提取除id
之外的所有属性并实例化新的灵感。
original = Inspiration.find(params[:inspiration_id])
@inspiration = Inspiration.new(original.attributes.except("id"))
我认为你想创建一个灵感的副本,以便预先填充一些字段。 根据您的具体要求,复制灵感可能是也可能不是一个好主意(引用其他对象,权限/访问,......)
答案 2 :(得分:0)
我不是100%的用例,因为您通常不会将ID传递给new
个动作。但是,如果您想要基于原始对象的所有属性的新对象,可以查看clone。
答案 3 :(得分:0)
我建议您重定向到编辑操作,而不是转到跟踪rails CRUD结构的新操作。如果您需要更多,请告诉我。