如何验证<%= file_field_tag“images []”,输入:: file,multiple:true%>

时间:2015-09-26 09:57:43

标签: ruby-on-rails ruby-on-rails-3 validation ruby-on-rails-4

我有两个型号

Gallery

class Gallery < ActiveRecord::Base
    has_many :pictures, :dependent => :destroy

    accepts_nested_attributes_for :pictures, :allow_destroy => true

    attr_accessible :name, :description, :pictures_attributes

    validates_presence_of :pictures
end

Picture

    class Picture < ActiveRecord::Base
      belongs_to :gallery

      has_attached_file :image,
        :path => ":rails_root/public/images/:id/:filename",
        :url  => "/images/:id/:filename"
    end

并形成

    <%= form_for @gallery, :html => { :class => 'form-horizontal', multipart: true } do |f| %>
    .........
     <div class="controls">
          <%= file_field_tag "images[]", type: :file, multiple: true %>
        </div>
    .........
    <% end %>

控制器

    def create
        @gallery = Gallery.new(gallery_params)

        respond_to do |format|
          if @gallery.save

            if params[:images]         
              params[:images].each { |image|
                @gallery.pictures.create(image: image)
              }
            end

            format.html { redirect_to @gallery, notice: 'Gallery was successfully created.' }
            format.json { render json: @gallery, status: :created, location: @gallery }
          else
            format.html { render action: "new" }
            format.json { render json: @gallery.errors, status: :unprocessable_entity }
          end
        end
      end
private

  def gallery_params
    params.require(:gallery).permit(:description,
                                    :name,
                                    :pictures
                                   )
  end

如果我想验证has_many图片图片是否为空白?,我每次都会收到图片为空白的错误,即使我选择了图片。

我如何验证has_many与多个图像字段的关联?

PARAMS

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"MCkZFvsYvRndlfaqwXiw5MfhSHGoesawEAPFWzn0Ulw=", "gallery"=>{"name"=>"", "description"=>""}, "images"=>[#<ActionDispatch::Http::UploadedFile:0x007fb7ad9cb7d0 @tempfile=#<Tempfile:/var/folders/r4/jqx7vz8d48z2ky3ndpyzv9vc0000gn/T/RackMultipart20150926-38180-1xrchqg>, @original_filename="yamaha-blaster-BOARD-HEROa.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"images[]\"; filename=\"yamaha-blaster-BOARD-HEROa.jpg\"\r\nContent-Type: image/jpeg\r\n">], "commit"=>"Create Gallery"}
   (0.1ms)  begin transaction
   (0.0ms)  rollback transaction

1 个答案:

答案 0 :(得分:1)

您的问题在于accepts_nested_attributes_for的使用 - 当您在代码中引用pictures时,您的模型引用是images

这是你应该怎么做的:

#app/models/picture.rb
class Picture < ActiveRecord::Base
   belongs_to :gallery
   validates :image, presence: true

   has_attached_file :image,
        :path => ":rails_root/public/images/:id/:filename",
        :url  => "/images/:id/:filename"
end

#app/models/gallery.rb
class Gallery < ActiveRecord::Base
   has_many :pictures
   accepts_nested_attributes_for :pictures, allow_destroy: true
end

您对image对象和Picture模型感到困惑。 IE,您需要通过images模型将Picture传递给Gallery模型:

#app/controllers/galleries_controller.rb
class GalleriesController < ApplicationController
   def new
      @gallery = Gallery.new
      @gallery.pictures.build
   end

   def create
      @gallery = Gallery.new gallery_params
      @gallery.save
   end

   private

   def gallery_params
      params.require(:gallery).permit(:description, :name, pictures_attributes: [:images])
   end
end

这意味着您将不得不使用f.fields_for,这可能会非常棘手。

以下是如何操作:

#app/views/galleries/new.html.erb
<%= form_for @gallery do |f| %>
   <%= f.text_field :name %>
   <%= f.fields_for :pictures do |picture| %>
      <%= picture.file_field type: :file, multiple: true %>
   <% end %>
   <%= f.submit %>
<% end %>

这对你有用。上传的多个方面,我不确定。