我有两个型号
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
答案 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 %>
这对你有用。上传的多个方面,我不确定。