我在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"
任何人都知道如何才能做到这一点?
答案 0 :(得分:2)
发生此错误是因为您要将现有图像复制到没有ID的新图像实例。当然,数据库将抛出主键异常。你为什么这样做?为什么不更新现有图像?
如果必须,您可以在保存新图像之前删除旧图像。
@image = Image.new(image_params)
@image.id = old_image.id
old_image.delete
@image.save
但这是一种丑陋,黑客的做法。如果出现故障,您也没有任何事务可以保证回滚数据库。
为什么不更新现有图像?