如何找到@object然后复制@object?

时间:2016-02-26 18:41:21

标签: ruby-on-rails ruby

以下代码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

4 个答案:

答案 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结构的新操作。如果您需要更多,请告诉我。