簡體   English   中英

嵌套的屬性圖片上傳未更新(Rails 4 / Carrierwave)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM