我正在尝试在rails中创建一个创建产品页面。这包括添加多个图像和文本字段。我有一个产品型号和一个照片。我正在使用paperclip gem进行照片上传。 但是当我查看产品页面时,我没有得到任何图片。照片未保存到数据库中。
P.S。我使用HAML。
应用/视图/产品/ show.html.haml
%b Name
= @product.name
%br
%b Description
= @product.description
%br
- @product.photos.each do |photo|
= image_tag photo.image.url
应用/控制器/ products_controller
class ProductsController < ApplicationController
before_filter :require_login
before_filter :current_user, only: [:create, :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
应用/模型/照片
class Photo < ActiveRecord::Base
attr_accessible :product_id
belongs_to :product
has_attached_file :image,
:styles => {
:thumb=> "100x100#",
:small => "300x300>",
:large => "600x600>"
}
end
应用/模型/产品
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
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
应用/产品/ new.html.haml
= form_for @product, :html => { :multipart => true } do |f|
%p
= fields_for :photos do |f_i|
=f_i.file_field :image
答案 0 :(得分:3)
首先你的表格是错误的,q用于注册使用fields_for的照片,然后你使用fields_for f.object.photos或使用Photo.new做| g |,你的关系模型中的另一个是错误的has_attached_file是has_many照片,has_attached_file Paperclip适合在模型中使用而不是与其他模型的关系。希望这有帮助,现在有了几张照片的产品,我建议你使用宝石茧,我根据你的情况,https://github.com/nathanvda/cocoon
答案 1 :(得分:3)
你曾在Photo model下写过:
has_many :photos, :through => :products
这没有任何意义.. 在你的照片模型写
belongs_to :product
在产品型号中写道:
has_many :photos
实际上这是我所理解的一对多关系:
无需在产品型号中编写has_attached_file。这将在照片模型下编写,如
has_attached_file :image
现在您有多张产品照片。所以你需要循环来显示这些照片。例如,在你的节目视图中做一些事情
<% unless @product.photos.blank? %>
<% @product.photos.each do |photo| %>
<%= image_tag photo.image.url %>
<% end %>
<% end %>
__ _ __ _ _ 编辑2 _ __ _ __ _ _ 强>
产品型号中的
has_many :photos, :dependent => :destroy
accepts_nested_attributes_for :photos, :allow_destroy => true
attr_accessible :photos_attributes
照片模型中的
belongs_to :product
attr_accessible :product_id
在您的产品控制器中
def new
@product = Product.new
5.times { @product.photos.build }
end
def create
@product = Product.new(params[:product])
@product.user_id = current_user.id
if @product.save
render "show", :notice => "Sale created!"
else
render "new", :notice => "Somehting went wrong!"
end
end
你的new.html.haml 中的
= 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.fields_for :photos do |f_i|
=f_i.file_field :image
现在试试。 !
答案 2 :(得分:1)
查看代码后。很简单,Product根本没有任何图像属性。照片有图像属性。
所以你必须访问产品 - &gt;照片 - &gt;图像
在控制器显示操作中执行此操作
@product = Product.find(id)
@photos = @product.photos
在show.html.erb
中-@photos.each do |photo|
= image_tag photo.image.url
-end
对于haml语法我的applogies现在使用html.erb处理项目。如果有任何错误,请更正haml语法。
答案 3 :(得分:-1)
我认为
5.times { @product.photos.build }
应该是#new方法 cuz .build方法与@fields_for交互
答案 4 :(得分:-1)
@product.image requires image to be the attribute of product model means image fields should be in products table.
@product.image should be @product.photo.image.url