2013-05-11 85 views
6

我正在嘗試在rails中創建產品頁面。這包括添加多個圖像和文本字段。我有一個產品模型和一個照片模型。我正在使用回形針創建照片上傳。 但是當我查看產品頁面時,我沒有得到任何圖片。照片沒有被保存到數據庫。Rails - 回形針 - 多張照片上傳不保存

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

+0

刪除此行** has_attached_file:您的產品模型中的照片**在此處不需要。 – 2013-05-23 07:39:10

+0

我到目前爲止還不明白爲什麼你又一次提出同樣的問題......老一代呢?你正在浪費別人的時間.. http://stackoverflow.com/questions/16665809/ruby-on-rails-paperclip-not-saving-to-database – 2013-05-30 08:41:18

+0

和第三個是在這裏 http://stackoverflow.com/問題/ 16807112/rails-paperclip-is-not-adding-my-image – 2013-05-30 08:47:48

回答

3

首先你的表格是錯誤的, q註冊使用fields_for的照片,然後使用fields_for f.objec t.photos或使用Photo.new do | g |,你的關係模型中的另一個是錯誤的has_attached_file是has_many照片,has_attached_file Paperclip適合在模型中使用,而不是與其他模型的關係中使用。希望這可以幫助,現在有幾個照片一款產品,我建議你使用寶石繭,我Q根據你的情況去,https://github.com/nathanvda/cocoon

+0

這不夠明確 – 2013-05-24 04:27:01

-1

我覺得

5.times { @product.photos.build } 

應在#NEW方法 的Cuz .build方法與互動@fields_for

+0

模型之間的關係搞砸了。 – 2013-05-22 12:17:21

-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 
+0

沒有工作我最終得到未定義的方法'照片爲零:NilClass – 2013-05-22 09:46:40

+0

有多張照片的產品.. @ product.photo將無法正常工作,我想需要顯示所有照片的循環! – 2013-05-22 12:19:01

3

您已經下照片模型寫爲:

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 %> 

__ _ __ _ _ EDIT 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 

馬上試試。 !

+0

好吧,所以我把這個,但在展示它永遠不會顯示任何圖像。 – 2013-05-24 04:15:36

+0

照片保存在分貝? – 2013-05-24 07:22:21

+0

呵呵......多數民衆贊成在奇怪,他們不是 – 2013-05-24 07:26:38

1

看完你的代碼後。它很簡單,產品根本沒有任何圖像屬性。照片有圖片屬性。

所以,你必須接入產品 - >照片 - >圖像

在控制器顯示行動做這個

@product = Product.find(id) 
@photos = @product.photos 

在show.html.erb

[email protected] do |photo| 
= image_tag photo.image.url 
-end 

對於HAML語法我這些日子正在使用html.erb處理項目。如果有任何錯誤,那麼正確的哈姆語法。

相關問題