0

Как загрузить несколько изображений с помощью CarrierWave?Rails 4 загрузки нескольких изображений с использованием несущей волны

Я последовал "drjorgepolanco" ответ от

Rails 4 multiple image or file upload using carrierwave

, но я получаю ошибку

undefined method `[]' for #<AssignmentpicUploader:0x007eff7831a4d8> 
    Extracted source (around line #25): 

    ActionView::Template::Error (undefined method `[]' for #<AssignmentpicUploader:0x007eff7831a4d8>): 
    22:  
    23:  
    24: <div id="img"> 
    25:  <%= image_tag @assignment.picture[1].url(:large) %> 
    26: </div> 
    27: 
    28: </br> 
    app/views/assignments/show.html.erb:25 

assignment.rb

class Assignment < ActiveRecord::Base 
     validates :name, length: { minimum: 1, maximum:120 } 
     validates :description, length: { minimum: 1 } 
     mount_uploader :picture, AssignmentpicUploader 
end 

assignments_controller.rb

class AssignmentsController < ApplicationController 
    before_action :authenticate_user! 
    before_filter :admin_access, only: [:new, :create, :edit, :update, :destroy] 


    def index 
    @assignments = Assignment.all.order("created_at DESC") 
    end 


    def show 
    @assignment = Assignment.find(params[:id]) 
    end 

    def new 
    @assignment = Assignment.new 
    end 

    def create 
    @assignment = current_user.assignments.build 
    @assignment.name = params[:assignment][:name] 
    @assignment.description = params[:assignment][:description] 
    @assignment.picture = params[:assignment][:picture] 


    if @assignment.save 
     flash[:notice] = "Assignment was saved successfully." 
     redirect_to @assignment 
    else 
     flash.now[:alert] = "Error creating assignment. Please make sure there is a name and description." 
     render :new 
    end 
    end 

    def edit 
    @assignment = Assignment.find(params[:id]) 
    end 

     def update 
    @assignment = Assignment.find(params[:id]) 

    @assignment.name = params[:assignment][:name] 
    @assignment.description = params[:assignment][:description] 
    @assignment.picture = params[:assignment][:picture] 

    if @assignment.save 
     flash[:notice] = "Assignment was updated successfully." 
     redirect_to @assignment 
    else 
     flash.now[:alert] = "Error saving assignment. Please try again." 
     render :edit 
    end 
     end 

    def destroy 
    @assignment = Assignment.find(params[:id]) 

    if @assignment.destroy 
     flash[:notice] = "\"#{@assignment.name}\" was deleted successfully." 
     redirect_to action: :index 
    else 
     flash.now[:alert] = "There was an error deleting the assignment." 
     render :show 
    end 
    end 

    private 

    def assignment_params 
     params.require(:assignment).permit(:name, :description, picture: []) 
    end 
end 

назначения/new.html.erb

 ... 
     <div class="col-md-8"> 
     <%= form_for @assignment, :html => { :multipart => true } do |f| %> 
      <div class="form-group"> 
      <%= f.label :name %> 
      <%= f.text_field :name, class: 'form-control', placeholder: "Enter assignment name" %> 
      </div> 
      <div class="form-group"> 
      <%= f.label :description %> 
      <%= f.text_area :description, rows: 8, class: 'form-control', placeholder: "Enter assignment description" %> 
      </div> 
      <div class="form-group"> 
      <%= f.label :picture %> 
      <%= f.file_field :picture, :multiple => true %> 
      </div> 
      <br /> 
      <%= f.submit "Save", class: 'button' %> 
     <% end %> 
     </div> 
    </div> 

задания/show.html.erb

<%= image_tag @assignment.picture[1].url(:large) %> 

schema.rb

create_table "assignments", force: :cascade do |t| 
    t.string "name" 
    t.text  "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    t.string "picture" 
    end 

    add_index "assignments", ["user_id"], name: "index_assignments_on_user_id" 
+0

Установите точку останова перед '' 'flash.now [: alert] ...' '' в создании действия и проверьте результат '' '@ assign.errors'''. Кто-то может помочь вам только с подробной информацией об ошибке – Zelenka

+0

как установить точку останова? извините im все еще noob. Нужен ли мне камень отладчика для этого? –

+0

Вы делаете. Я бы рекомендовал использовать https://github.com/pry/pry – Zelenka

ответ

0

Carrierwave документация говорит:

Добавьте столбец, который может хранить массив. Например, это может быть столбец массива или столбец JSON. Ваш выбор зависит от того, что поддерживает ваша база данных.

Ваша «картина» - это просто строка. Добавьте serialize :picture, JSON в свою модель.

+0

Спасибо, что остановил сообщение об ошибке проверки и указал на код, вызывающий ошибку, которую я сейчас задал в моем вопросе. –

+0

Как вы можете видеть в ошибке, проблема связана с массивом, который нельзя сохранить в виде строки. Пожалуйста, сделайте предложения из моего ответа. – Zelenka

+0

Я добавил «serialize: picture, JSON» в свой файл assign.rb, но как я могу изменить: изображение, которое является строкой для столбца типа JSON? –

Смежные вопросы