0

Railsアプリには、写真用のネストされたフォームを含む製品ページの作成があります。常に写真が存在することを確認するための検証があります。しかし、写真なしでフォームを送信しようとすると、製品フォームが写真入力フィールドなしで再レンダリングされました。

新商品ページ Haml

= form_for @product,:url => products_path, :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
  - if @photo.errors.any?
    .error_messages
      %h2 Image is invalid
      %ul
        - for message in @photo.errors.full_messages
          %li
            = message
  %p
    = f.label :description
    = f.text_field :description
  %p
    = f.fields_for :photos do |fp|
      =fp.file_field :image
      %br
  %p.button
    = f.submit

製品コントローラ

class ProductsController < ApplicationController

  def new 
    @product = Product.new
    @photo = Photo.new
    4.times{ @product.photos.build }
  end

  def create
  @product = current_user.products.new(params[:product])
  @photo = current_user.photos.new(params[:photo])

    if @product.valid?
      @product.save
      @photo.product_id = @product.id
      @photo.save
      render "show", :notice => "Sale created!"
    else
      render "new", :notice => "Somehting went wrong!"
    end
end

  def edit
    @product = Product.find(params[:id])
    @photos_left = 4 - @product.photos.count 
    @new_photos = @photos_left.times.map{ @product.photos.build }
  end

  def update
    @product = Product.find(params[:id])
    if @product.update_attributes(params[:product])
      render "show", :notice => "Sale editted!"
    else
      render "edit", :notice => "Failed"
    end
  end
4

1 に答える 1

7

4.times{ @product.photos.build }保存に失敗した場合は createに追加

create アクションを次のように更新します。

def create
  @product = current_user.products.new(params[:product])
  @photo = current_user.photos.new(params[:photo])

    if @product.valid?
      @product.save
      @photo.product_id = @product.id
      @photo.save
      render "show", :notice => "Sale created!"
    else
      4.times{ @product.photos.build } #you need to rebuild the photos here
      render "new", :notice => "Somehting went wrong!"
    end
end

更新アクションにも同様の変更が必要です

于 2013-06-24T03:18:13.073 に答える