1

Я использую Paperclip, и я добавил несколько загрузок файлов на одну из моих моделей. Все работает отлично, за исключением случаев, когда я пытаюсь добавить новые файлы в уже загруженные. Это порождает эту ошибку:500 исправление ошибок и обновление нескольких загружаемых файлов rails

Unexpected error while processing request: expected Hash (got Array) for param `assets_attributes' 

Как исправить это, чтобы добавить новые файлы? Заранее спасибо.

asset.rb

class Asset < ActiveRecord::Base 

    belongs_to :member 
    belongs_to :listing 

    attr_accessible :asset 

    has_attached_file :asset, styles: { large: "700x700>", thumb: "100x100#" } 

    validates_attachment_size :asset, :less_than_or_equal_to=>10.megabyte 
    validates_attachment_content_type :asset, :content_type=>['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] 

end 

listing.rb

has_many :assets, :dependent => :destroy 
accepts_nested_attributes_for :assets, :allow_destroy => true 

attr_accessible :assets_attributes 

объявления/_edit_form.html.erb

<%= simple_form_for(@listing, :html => { class: 'form-horizontal ', :multipart => true }) do |f| %> 
    <% if @listing.errors.any? %> 
    <%= f.error_notification %> 

    <div> 
     <%= file_field_tag('listing_assets_asset', multiple: true, name: "listing[assets_attributes][][asset]", id: 'file-upload3', class: '') %> 
    </div> 

<% end %> 

listings_controller.rb

before_filter :authenticate_member!, only: [:new, :create, :edit, :update, :destroy] 
    before_filter :find_member 
    before_filter :find_listing, only: [:edit, :update, :destroy] 

    def new 
    @listing = Listing.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @listing } 
    end 
    end 

    # GET /listings/1/edit 
    def edit 

    end 

    # POST /listings 
    # POST /listings.json 
    def create 
    @listing = current_member.listings.new(params[:listing]) 

    respond_to do |format| 
     if @listing.save 
     current_member.create_activity(@listing, 'created') 
     format.html { redirect_to @listing } 
     format.json { render json: @listing, status: :created, location: @listing } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /listings/1 
    # PUT /listings/1.json 
    def update 

    respond_to do |format| 
     if @listing.update_attributes(params[:listing]) 
     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 

    private 

    def find_member 
     @member = Member.find_by_user_name(params[:user_name]) 
    end 

    def find_listing 
     @listing = current_member.listings.find(params[:id]) 
    end 
+0

Можете ли вы разместить запрос с консоли сервера? Вы также можете проверить этот вопрос: http://stackoverflow.com/questions/1577631/rails-form-with-multiple-nested-models-causes-issues-with-radio-groups – sixty4bit

ответ

-1

Это исправили проблему ошибки, но не исправить мою общую проблему. Я нашел решение своей проблемы, просмотрев эту статью: http://www.railscook.com/recipes/multiple-files-upload-with-nested-resource-using-paperclip-in-rails/

Мне нужно было изменить способ обработки нескольких загрузок.

Изменение мой вклад в это:

<%= file_field_tag "assets[]", type: :file, multiple: true, id: 'file-upload3' %> 

и добавив следующие мои создания и обновления действий в моем контроллере:

if params[:assets] 
    params[:assets].each { |asset| 
     @listing.assets.create(asset: asset) 
    } 
end 

Выполнение этих вещей помогло устранить проблему.

+0

Это плохой подход, добавляя этот хак в ваш контроллер, вместо того чтобы преследовать его правильно, используя 'accepts_nested_attributes_for', где вы начали. – smathy

1

accepts_nested_attributes_for ожидает хэш для значения *_attributes, что он обрабатывает, хэш он ожидает, имеет индексы массива в качестве ключей, то есть. он ожидает что-то вроде этого:

asset_attributes: { 
    0 => { asset: value_for_0 }, 
    1 => { asset: value_for_1 } 
} 

Создавая имя вашего поля формы, как listing[assets_attributes][][asset] вы фактически создаете массив, то есть.

asset_attributes: [ 
    { asset: value_for_0 }, 
    { asset: value_for_1 } 
] 

Вот почему вы получили сообщение об ошибке.

Я думаю, что вы имели в виду, чтобы назвать ваше поле было: listing[assets_attributes][asset][], который создал бы:

asset_attributes: { 
    0 => { asset: [ array, of, IO, objects, for, your, files ] } 
} 
+0

Это исправляет ошибку 500, но затем я получаю это: 'невозможно преобразовать String в Integer'' app/controllers/listings_controller.rb: 86: in 'block in update' '' app/controllerlers/lists_controller.rb: 85: in 'update'' – iamdhunt

+0

Я рад чтобы услышать, что мой ответ разрешил проблему, которую вы опубликовали (подсказка подсказки :) Вы новичок в StackOverflow, поэтому прежде всего приветствуем, а затем, пожалуйста, прочитайте [Что делать, если кто-то отвечает на мой вопрос?] (http: // stackoverflow .com/помощь/кто-ответы).Затем, попробовав несколько вещей, чтобы решить вашу новую проблему, вы можете опубликовать новый вопрос с подробностями. – smathy