неопределенный метод `each 'для #‹ ActionDispatch :: Http :: UploadedFile: 0xa5741c0 ›

Я пытаюсь загрузить файл с помощью CarrierWave, а модель Image является полиморфной. Но я получил ошибку, как в заголовке, так что вот мои модели:

class Image < ActiveRecord::Base
    belongs_to :imageable, polymorphic: true

    mount_uploader :image, ImageUploader

    enum image_type: {icon: 1, title: 2, regular: 3, slider: 4}
end

class Service < ActiveRecord::Base
    has_many :images, as: :imageable, :dependent => :destroy
    accepts_nested_attributes_for :images

end

и _form.html.erb:

<div class="control-group">
   <%= simple_fields_for :images do |image| %>


     <div class="controls">
        <label class="control-label">Hizmet Büyük Resimi</label> 
        <div class="fileupload fileupload-new" data-provides="fileupload">
          <div class="fileupload-new thumbnail" style="width: 200px; height: 150px;"><img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&amp;text=no+image" alt=""/></div>
          <div class="fileupload-preview fileupload-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 20px;"></div>
          <div>
            <span class="btn btn-file"><span class="fileupload-new">Resim Seç</span><span class="fileupload-exists">Değiştir</span>
              <%= image.input :image, input_html: { type: :file, class: "default"}, wrapper: false, label: false %>
              <%= image.input :image_type, :as => "hidden", :input_html => { :value => 2 } %>
            </span>
            <a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Sil</a>
          </div>
        </div>


     </div>
   <% end %>
</div>

и действие service_controller "создать":

def create
    @service = Service.new(service_params)

    if @service.save
      if params[:images]
        params[:images][:image].each do |i|
          @image = @service.images.create!(:image => i, :imageable_id => @service.id, :image_type => params[i][:image_type])
        end
      end

      flash[:notice] = "Hizmet sayfası başarıyla oluşturuldu!"
      redirect_to admin_services_path
    else
      flash[:alert] = "Hizmet sayfası eklenirken bir hata oluştu. Lütfen tekrar deneyiniz!"
      render "new"
    end
  end

Сообщение об ошибке:

undefined method `each' for #<ActionDispatch::Http::UploadedFile:0xa5741c0>

Rails.root: D:/Projects/TorkGarage/website/torkgarage

Application Trace | Framework Trace | Full Trace
app/controllers/admin/services_controller.rb:19:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"yN62eOMu2gTrNIWgs27XBiA3uxIAGVgTGt4ywTSm3lKn4kEqG2Ka+3IdaqvSpRQrOPVkBBiuWLl1l5jx5fEUWw==",
 "service"=>{"service_name"=>"Rot - Balans",
 "service_description"=>"sdsad asdas&nbsp;",
 "meta_keywords"=>"adas da"},
 "_wysihtml5_mode"=>"1",
 "images"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0xa5741c0 @tempfile=#<Tempfile:C:/Users/mehmet/AppData/Local/Temp/RackMultipart20150430-6992-8dc0q8.png>,
 @original_filename="Layer-6.png",
 @content_type="image/png",
 @headers="Content-Disposition: form-data; name=\"images[image]\"; filename=\"Layer-6.png\"\r\nContent-Type: image/png\r\n">,
 "image_type"=>"2"},
 "button"=>""}

Итак, что происходит в этой ситуации?


person mehmetserif    schedule 30.04.2015    source источник
comment
.each используется для массива, но здесь в параметрах нет массива, это хеш. поэтому он выдает эту ошибку.   -  person Kushal    schedule 30.04.2015
comment
@Kushal, так что вместо .each я должен использовать .each do | key, value |?   -  person mehmetserif    schedule 30.04.2015
comment
измените params[:images][:image].each на params[:images].each, который должен зацикливаться на объектах UploadedFile   -  person MrYoshiji    schedule 30.04.2015
comment
@MrYoshiji, я тоже пробовал это, но на этот раз я получил неопределенный метод `[] 'для nil: ошибка NilClass.   -  person mehmetserif    schedule 30.04.2015


Ответы (1)


Вы пытаетесь перебрать массив изображений, но в ваших параметрах есть только одно изображение, поэтому исправление заменяется:

params[:images][:image].each do |i|
  @image = @service.images.create!(:image => i, :imageable_id => @service.id, :image_type => params[i][:image_type])
end

с участием

@image = @service.images.create!(:image => params[:images][:image], :imageable_id => @service.id, :image_type => params[:images][:image_type])
person Aguardientico    schedule 30.04.2015
comment
Вы все еще вызываете .each для объекта UploadedFile ... который также вызывает NoMethodError - person MrYoshiji; 30.04.2015
comment
Да, это тоже не работает, используется ли в решении пара ключ-значение? - person mehmetserif; 30.04.2015
comment
Извините, моя плохая, эффект от использования копировать и вставлять, обновил ответ - person Aguardientico; 30.04.2015
comment
Да, это решило проблему, но у меня есть еще один вопрос: в той же форме будет больше загрузок файлов, и каждая из них связана с одной и той же моделью, но их типы изображений разные. Так что время будет использовать каждую работу? Это вложенная форма, и мне нужно иметь более одного image_type ... @Aguardientico - person mehmetserif; 30.04.2015
comment
Да, но вам нужно будет изменить ввод html на массив, я имею в виду, что вместо name='image' вы должны использовать name='image[]' - person Aguardientico; 30.04.2015
comment
@Aguardientico: в моей ситуации будет 3 одиночных загрузки и 1 множественная загрузка, я знаю, это звучит плохо, но что касается различных image_types, мое решение будет таким. Итак, для нескольких изображений вы правы, я могу справиться с name = 'image []', но будут и одиночные. - person mehmetserif; 30.04.2015