6

Railsで商品ページを作ろうとしています。これには、複数の画像の追加が含まれます。写真用とユーザー用に、製品用に 1 つのモデルがあります。写真のアップロードには paperclip gem を使用しています。しかし、私には2つの問題があります。

  1. ファイル入力で複数の画像を選択できない
  2. 写真がデータベースに保存されていないため、製品を表示しても写真が表示されない

PS私は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
4

6 に答える 6

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
于 2013-05-29T07:15:53.287 に答える
1

バックグラウンド ジョブに使用していますか。はいの場合は、 .in railsResqueを使用して開始する必要があります。通常、メーラーと画像のアップロードを含むバックグラウンド ジョブを処理するために使用されます。ペーパークリップ付きの製品は、Amazon S3 で構成されます。rake resque:work QUEUE='*'Resque

product.html.erb

<%= render :partial => 'photos' %>

少なくとも 1 つの画像の _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' : ''%> "/>
于 2013-05-29T11:20:59.423 に答える
0

ここでの本当の問題は、1 つのモデルにクリップを介して複数の写真を添付し​​たいということだと思います。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 %>
于 2013-05-21T09:42:54.367 に答える