6

我正在尝试在 Rails 中创建产品页面。这包括添加多个图像和文本字段。我有一个产品模型和一个照片模型。我正在使用回形针 gem 上传照片。但是当我查看产品页面时,我没有得到图片。照片未保存到数据库。

PS我使用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 
4

5 回答 5

3

首先你的表单是错误的,q 用于注册照片使用fields_for,然后你使用fields_for f.object.photos 或使用Photo.new do | g |,你的关系模型中的另一个是错误的has_attached_file是has_many照片,has_attached_file回形针适合在模型中使用而不是在与其他模型的关系中使用。希望对你有帮助,现在有一个产品有几张照片,我建议你使用宝石茧,我根据你的情况去,https://github.com/nathanvda/cocoon

于 2013-05-11T19:38:19.380 回答
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 %>

_ _ __ _ _编辑 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 

现在试试。!

于 2013-05-22T12:13:44.140 回答
1

看了你的代码后。Product 根本没有任何图像属性,这很简单。照片具有图像属性。

所以你必须访问产品 -> 照片 -> 图像

在控制器显示动作中执行此操作

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

在 show.html.erb

-@photos.each do |photo|
= image_tag photo.image.url
-end

对于haml 语法,我的应用程序是这些天使用html.erb 处理项目。如果有任何错误,请纠正haml语法。

于 2013-05-23T07:37:40.147 回答
-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
于 2013-05-22T09:20:55.327 回答
-1

我认为

5.times { @product.photos.build }

应该在#new 方法中因为 .build 方法与 @fields_for 交互

于 2013-05-12T04:33:10.420 回答