我正在尝试在rails中创建一个创建产品页面。这包括添加多个图像。我有一个产品模型,一个用于照片和用户。我正在使用paperclip gem进行照片上传。但我有两个问题。
P.S。我使用HAML而我没有照片控制器。
产品控制器
class ProductsController < ApplicationController
before_filter :current_user, only: [:create, :destory]
before_filter :correct_user, only: :destory
def new
@product = Product.new
@photo = Photo.new
5.times { @product.photos.build }
end
def create
@photo = current_user.photos.build(params[:photo])
@product = current_user.products.build(params[:product])
if @product.save
render "show", :notice => "Sale created!"
else
render "new", :notice => "Somehting went wrong!"
end
end
def show
@product = Product.find(params[:id])
end
创建产品页面
= form_for @product, :html => { :multipart => true } do |f|
- if @product.errors.any?
.error_messages
%h2 Form is invalid
%ul
- for message in @product.errors.full_messages
%li
= message
%p
= f.label :name
= f.text_field :name
%p
= fields_for :photos do |f_i|
=f_i.file_field :image
%p.button
= f.submit
产品型号
class Product < ActiveRecord::Base
attr_accessible :description, :name, :price, :condition, :ship_method, :ship_price, :quantity, :photo
has_many :photos, dependent: :destroy
accepts_nested_attributes_for :photos
belongs_to :user
照片模型
class Photo < ActiveRecord::Base
attr_accessible :product_id
belongs_to :product
has_attached_file :image,
:styles => {
:thumb=> "100x100#",
:small => "300x300>",
:large => "600x600>"
}
end
用户模型
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation, :name
attr_accessor :password
has_many :products, dependent: :destroy
has_many :photos,:through=>:products
显示产品页面
%b seller
= @product.user.name
%br
- @product.photos.each do |photo|
= image_tag photo.image.url
答案 0 :(得分:3)
您的用户型号未附加到照片上,因此照片仅属于产品型号,因此您需要将用户型号更改为
class User < ActiveRecord::Base
has_many :products
has_many :photos,:through=>:products
end
然后您可以通过
获取用户照片 @photos =current_user.photos
或者您可以轻松制作照片
@photo = current_user.photos.build(params[:photo])
也可以在你的视图中代替 = f.file_field:photo,multiple:'multiple'
使用
= fields_for :photos do |f_i|
=f_i.file_field :image
试一试。
这是通过关联有很多的简单方法
class Document < ActiveRecord::Base
has_many :sections
has_many :paragraphs, :through => :sections
end
class Section < ActiveRecord::Base
belongs_to :document
has_many :paragraphs
end
class Paragraph < ActiveRecord::Base
belongs_to :section
end
您可以查看这些指南以获取更多信息
http://guides.rubyonrails.org/association_basics.html 你也需要把
accepts_nested_attributes_for :photos
在产品型号中
有关嵌套表单的完整教程,您可以观看这些屏幕投射
http://railscasts.com/episodes/196-nested-model-form-revised
它不是免费的
如果你没有订阅railscasts.com
,你可以观看这些免费的网络广播答案 1 :(得分:2)
尝试一下:
新产品页面
= form_for @product, :html => {:multipart => true} do |f|
%p
= f.label :description
= f.text_field :description
= f.fields_for :photo do |fp|
= fp.file_field :image
= fp.check_box :_destroy
= fp.label :_destroy, "Remove Image"
%p.button
= f.submit
产品控制器
def new
@product = Product.new
@product.photos.build
end
def create
@product = current_user.products.create(params[:product])
# or
# @product = current_user.products.build(params[:product])
# @product.save
end
产品型号
class Product < ActiveRecord::Base
attr_accessible :description, :name, :photo
accepts_nested_attributes_for :photo, :reject_if => lambda { |p| p[:image].nil? }, :allow_destroy => true
belongs_to :user
has_many :photos, dependent: :destroy
validates :user_id, presence: true
validates :photo, presence: true
end
照片模特
class Photo < ActiveRecord::Base
attr_accessible :image
belongs_to :product
validates_attachment :image, presence: true,
content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] },
size: { less_than: 5.megabytes }
has_attached_file :image, styles: { medium: "320x240>"}
end
答案 2 :(得分:1)
build
方法只创建一个对象。它不会将对象保存到db。您应该在创建操作中调用object.save
或使用create
方法而不是build
答案 3 :(得分:1)
你是否使用Resque
作为后台工作,如果是,那么你需要使用rake resque:work QUEUE='*'
启动它。通常Resque
用于处理涉及邮件和图片上传的后台作业。或者下面是product.html.erb的一个示例,该部分用于通过使用回形针配置Amazon S3的该产品上传照片。
product.html.erb
<%= render :partial => 'photos' %>
_photos.html.erb至少一张图片必须
<% if @product.photos[0].nil? %>
<a href="javascript:void(0);" class="add-photos" >
<img src="/assets/default/product-add-photos.png" alt="Add product photos"/>
</a>
<% end %>
<img src="<%= (@product.product_photos[0].nil? ? "" : @product.photos[0].image.url(:small)) %>" id="photos_1" class="product-photos-src <%=@product.photos[0].nil? ? 'dontdisplay' : ''%> "/>
答案 4 :(得分:0)
我认为这里真正的问题是你想通过回形针在一个模型上附加多张照片。 Paperclip每个模型只能附加1个文件,所以我建议你这样做:
1. create model Photo with paperclip migrations + has_attached_file
2. Product has_many :photos
3. (optional) make a function to return all image urls, otherwise just call the method in the view
class Product
def get_pics
photos.collect{|p| p.image.url}
end
end
也是一件好事,你现在可以在照片模型中包含替代文字和东西等元数据!
<% @product.photos.each do |photo| %>
<%= image_tag photo.image.url, :alt => photo.alt_text %>
<% end %>
答案 5 :(得分:0)
我也遇到过同样的问题。我询问了stackoverflow,最后解决了自己和rails的帮助。
要改变的第一件事是: 您必须按照此操作在模型端和控制器端实现嵌套属性:
http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
然后按照下面的链接,检查我的问题的答案,其中包括您应该遵循嵌套表单的rails cast链接:
您将看到rails cast第二个链接动态地分隔您的每个字段字段,因为它自己无法分隔每组字段。但是在rails-cast中也缺乏身份唯一性algo准确性。所以我加强了以确保某些字段集的唯一性。
jquery render partial just one time, for second time it not render again just shows previous one