[英]Nested Attribute Image Uploads Not Updating (Rails 4/ Carrierwave)
我正在使用此示例使用Carrierwave Rails 4創建多個圖像上傳, 或者使用carrierwave創建多個圖像或文件 。 由於某些原因,如果我編輯帖子並嘗試上傳其他圖片,它不會更新。
listings_controller.rb
class ListingsController < ApplicationController
before_action :set_listing, only: [:show, :edit, :update, :destroy]
before_filter :authenticate_user!, :except => [:show, :index]
def index
@listings = Listing.order('created_at DESC')
respond_to do |format|
format.html
format.json { render json: @listings }
end
end
def show
@image_attachments = @listing.image_attachments.all
end
def new
@listing = Listing.new
@listing.user = current_user
@image_attachment = @listing.image_attachments.build
end
def edit
end
def create
@listing = Listing.new(listing_params)
@listing.created_at = Time.now
@listing.user = current_user
respond_to do |format|
if @listing.save
params[:image_attachments]['image'].each do |a|
@image_attachment = @listing.image_attachments.create!(:image => a, :listing_id => @listing.id)
end
format.html { redirect_to @listing, notice: 'Post was successfully created.' }
else
format.html { render action: 'new' }
format.json { render json: @listing.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @listing.update(listing_params)
flash[:notice] = 'Deal was successfully updated.'
format.html { redirect_to @listing }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @listing.errors, status: :unprocessable_entity }
end
end
end
def destroy
@listing.destroy
respond_to do |format|
format.html { redirect_to listings_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_listing
@listing = Listing.friendly.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def listing_params
params.require(:listing).permit(:condition, :listing_title, :nickname, :listing_size, :listing_price, :user_id, image_attachments_attributes: [:id, :listing_id, :image])
end
end
上市表格
<%= form_for(@listing, :html => { :class => 'form', :multipart => true }) do |f| %>
<% if @listing.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@listing.errors.count, "error") %> prohibited this listing from being saved:</h2>
<ul>
<% @listing.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.fields_for :image_attachments do |p| %>
<div>
<%= p.label :image %>
<%= p.file_field :image, :multiple => true, name: "image_attachments[image][]", :class => 'upload' %>
</div>
<% end %>
<div class="actions">
<%= f.submit 'Submit', :class => 'submitButton' %>
</div>
<% end %>
listing.rb
has_many :image_attachments
accepts_nested_attributes_for :image_attachments
有什么幫助嗎? 謝謝。
UPDATE
這是我嘗試更新圖像字段時的日志輸出。 “ about.png”是我要上傳的新圖片。
Started PATCH "/listings/nike-air-max-90" for 127.0.0.1 at 2014-07-16 11:40:14 -0400
Processing by ListingsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LU1ADy5JqfuX9CMDtcG/dmGgu9nuvplDQrVixfICsS4=", "listing"=>{"listing_title"=>"Nike Air Max 90", "nickname"=>"", "listing_size"=>"9.5", "listing_price"=>"160", "image_attachments_attributes"=>{"0"=>{"id"=>"1"}}}, "image_attachments"=>{"image"=>[#<ActionDispatch::Http::UploadedFile:0x00000109506810 @tempfile=#<Tempfile:/var/folders/vk/x5f3g8n147z_j39_mzkbfq600000gp/T/RackMultipart20140716-1370-63vlgx>, @original_filename="about.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"image_attachments[image][]\"; filename=\"about.png\"\r\nContent-Type: image/png\r\n">]}, "commit"=>"Submit", "id"=>"nike-air-max-90"}
[1m[35mListing Load (0.2ms)[0m SELECT "listings".* FROM "listings" WHERE "listings"."slug" = 'nike-air-max-90' ORDER BY "listings"."id" ASC LIMIT 1
[1m[36mUser Load (0.2ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1[0m
[1m[35m (0.1ms)[0m begin transaction
[1m[36mImageAttachment Load (0.1ms)[0m [1mSELECT "image_attachments".* FROM "image_attachments" WHERE "image_attachments"."listing_id" = ? AND "image_attachments"."id" IN (1)[0m [["listing_id", 2]]
[1m[35m (0.1ms)[0m commit transaction
Redirected to http://localhost:3000/listings/nike-air-max-90
Completed 302 Found in 5ms (ActiveRecord: 0.6ms)
選項1(將所有現有附件替換為新上傳的附件
在update
操作中,您沒有執行create
操作中的操作。 這是什么
params[:image_attachments]['image'].each do |a|
@image_attachment = @listing.image_attachments.create!(:image => a, :listing_id => @listing.id)
end
您不能期望Rails神奇地為您完成此操作,因為這不是accepts_nested_attributes
功能的典型用法。 實際上,在您當前的代碼中,您根本沒有使用此功能。
如果要使其與當前代碼一起使用,則必須刪除所有現有的image_attachments
並在update
操作中創建新的image_attachments
,如下所示:
def update
respond_to do |format|
if @listing.update(listing_params)
if params[:image_attachments] && params[:image_attachments]['image']
# delete existing image_attachments
@listing.image_attachments.delete_all
# create new ones from incoming params
params[:image_attachments]['image'].each do |a|
@image_attachment = @listing.image_attachments.create!(:image => a, :listing_id => @listing.id)
end
end
flash[:notice] = 'Deal was successfully updated.'
format.html { redirect_to @listing }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @listing.errors, status: :unprocessable_entity }
end
end
end
如果您上傳新圖像,它將用新圖像替換所有現有圖像。
選項2(單獨編輯)
如果您希望能夠更新現有附件,則必須修改編輯表單以允許單獨更新附件記錄。 或者通過正確使用accepts_nested_attributes
功能來實現。 繭是一種很棒的寶石,可以幫助您輕松地將嵌套屬性合並到表單中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.