4

私はしばらくこの問題を無視してきましたが、もうできません。製品を表示すると、ネストされたイメージ モデル オブジェクトproduct_imagesが表示されません。このため、ビューをレンダリングしようとすると、アプリケーションがイメージが nil であるというエラーを呼び出します。rendereditshow

ネストされた製品画像が表示されないのはなぜですか? 私はペーパークリップとs3を使用しています。

ネストされた画像フォームを編集可能にする必要があります。新しい製品が作成されたときにすべてが機能します。編集だけが問題です。show アクション中の nil 例外は、編集アクションの誤動作に関連しています。

以下は私のコードです:

モデル ##

class ProductImage < ActiveRecord::Base
  attr_accessible :product_id, :photo, :image_width, :image_height
  belongs_to :product
  has_attached_file :photo, :styles => { :small => "150x150>"}, :dependent => :destroy

  validates_attachment_presence :photo
  validates_attachment_size :photo, :less_than => 5.megabytes
  validates_attachment_content_type :photo, :content_type => ['image/jpg', 'image/jpeg', 'image/png', 'image/gif']
  after_post_process :save_image_dimensions

  def save_image_dimensions
      geo = Paperclip::Geometry.from_file(photo.queued_for_write[:original])
      self.image_width = geo.width.to_i
      self.image_height = geo.height.to_i
  end
  def sized_different?
  if image_width < image_height
          true
  else
          false

  end
  end
end


class Product < ActiveRecord::Base
  attr_accessible :taxable, :shippable, :page_name, :tact_code, :manu_code, :body_code, :name, :alert, :price, :description, :colors_attributes, :sizes_attributes, :extras_attributes, :restraints_attributes, :product_images_attributes
  validates_presence_of :page_name
  validates_presence_of :price
  validates_presence_of :description
  validates_presence_of :name
  has_many :product_images, :dependent => :destroy
  has_many :restraints, :dependent => :destroy
  has_many :colors, :dependent => :destroy
  has_many :sizes, :dependent => :destroy
  has_many :extras, :dependent => :destroy
  accepts_nested_attributes_for :colors, :sizes, :extras, :restraints, :product_images
end

コントローラ

  def index
          @products = Product.search(params)
      unless current_cart.nil?
          @cart = current_cart
      else
          @cart = nil
      end
  end
  def new
          @product = Product.new
          @product.product_images.build
  end
  def create
          @product = Product.new(params[:product])

          if @product.save
                  render :index
          else
                  render :new
          end
  end
def edit
          @product = Product.find(params[:id])
          @cart = current_cart
  end
  def show
          @product = Product.find(params[:id])
          @cart = current_cart
  end
  def update
          @product = Product.find(params[:id])
          if @product.update_attributes!(params[:product])
            render :index
          else
            render :edit
          end  
   end
end

_form ビュー

<%= form_for @adminproduct, validate: true, html:{ multipart: true} do |f| %>
  <div class="span3 field">
    <ul class="unstyled">
      <li><%= f.text_field :name, :placeholder => "Product name" %></li>
      <li><%= f.text_field :manu_code, :placeholder => "Manufacturer code" %></li>
      <li><%= f.text_field :alert, :placeholder => "Alert, example: Save 10%" %></li>
      <li><%= f.text_field :price, :placeholder => "Base price"  %></li>
      <li><%= f.text_area :description, :placeholder => "Product description", :size => "30x10" %></li>

</ul>
  </div>
  <div class="span6 offset1">
    <ul class="unstyled">
      <li><%= f.check_box :taxable %>Item can be taxed</li>
      <li><%= f.check_box :shippable%>Item can be standard shipped</li>

      <li><br /><b>Choose product images:</b></li>
      (the first image will be the product's main image)<br/>
      <%= f.fields_for :product_images do |p|%><%= render 'product_image_fields', f: p %><% end %>
            <li><%= link_to_add_fields "Add image", f, :product_images %></li>

どんな洞察も高く評価されます。

編集

製品画像の一部

<fieldset>
        <%= f.file_field :photo %>
        <%= f.hidden_field :_destroy %>
        <%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
4

3 に答える 3

1

products_controller で、edit アクションを変更して product_images を含め、accepts_nested_attributes_forが更新するイメージを認識できるようにします。

def edit
  @product = Product.includes(:product_images).find(params[:id])
  # ...
end
于 2013-07-30T18:14:21.937 に答える
0

次のようにパーシャルを呼び出す必要があると思います:

<%= render partial: 'product_image_fields', locals: {f: p} %>

うまくいかない場合は、元の質問に「product_image_fields」ファイルとコンソールからのエラー メッセージを貼り付けてください。

--

わかりました、これはあなたのパーシャルです

<fieldset>
        <%= f.file_field :photo %>
        <%= f.hidden_field :_destroy %>
        <%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>

あなたの問題は空のproduct_imageアップロード入力です。を生成する file_field を使用するinput type=fileと、HTML ではこの種のフィールドに値を入力できません。つまり、データベースから に値をロードすることはできませんfile_field

これは私のアドバイスです:

パーシャルを変更して、データベースからのものを出力します。これは、データが正しい場所に到着したことを確認するためのものです。

<fieldset>
        <%= f.object.send :photo %>

        <%= f.file_field :photo %>
        <%= f.hidden_field :_destroy %>
        <%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>

画像のパスを画面に表示する必要があります。また、HTML ソースを見てください。Rails は、画像レコード ID を含む隠しフィールドを追加する必要があります。

問題がなければ、画像を 以外のもので表示する必要がありますfile_field。image_tag など、使用したいものを試してください。

于 2013-07-26T01:05:06.090 に答える