Rails - paperclip - 多张照片上传不保存

时间:2013-05-11 19:05:08

标签: ruby-on-rails ruby ruby-on-rails-3 paperclip

我正在尝试在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 

5 个答案:

答案 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