如何通过将其替换为另一个对象来更新rails表中的对象?

时间:2014-09-22 01:03:47

标签: ruby-on-rails ruby model

我在rails表中有图像。该表具有固定数量的图像,因此在上载图像时,它不会附加到表的末尾,而是替换表中已有的一个图像(更新)。

以下是我收集图片的表格:

<%= form_for :image, url: images_path do |f| %> 

  <p>
    <%= f.file_field :file %> 
  </p> 

  <p>
    <input type="radio" name="image[id]" value="1">1 
    <input type="radio" name="image[id]" value="2">2
    <input type="radio" name="image[id]" value="3">3
  </p>

  <p><%= f.submit "submit" %></p>
<% end %> 

以下是表单调用的create操作:

def create 
    @image = Image.new(image_params)

    image = Image.find_by(id: image_params["id"])
    image = @image

    if image.save 
        redirect_to '/'
    else 
        render 'links/new'
    end
end 

private 

    def image_params
        params.require(:image).permit(:file, :id)
    end

然而产生以下错误:

SQLite3::ConstraintException: PRIMARY KEY must be unique: INSERT INTO "images"

任何人都知道如何才能做到这一点?

1 个答案:

答案 0 :(得分:2)

发生此错误是因为您要将现有图像复制到没有ID的新图像实例。当然,数据库将抛出主键异常。你为什么这样做?为什么不更新现有图像?

如果必须,您可以在保存新图像之前删除旧图像。

@image = Image.new(image_params)
@image.id = old_image.id
old_image.delete
@image.save

但这是一种丑陋,黑客的做法。如果出现故障,您也没有任何事务可以保证回滚数据库。

为什么不更新现有图像?