首页 文章

Rails 4使用carrierwave上传多个图像

提问于
浏览
0

如何使用CarrierWave上传多个图像?

我跟着“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>
          
<%= 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"

1 回答

  • 0

    Carrierwave文档说:

    添加一个可以存储数组的列 . 例如,这可以是数组列或JSON列 . 您的选择取决于您的数据库支持的内容 .

    你的"picture"只是一个字符串 . 将 serialize :picture, JSON 添加到您的模型中 .

相关问题