重新加载表单时,嵌套输入消失

Ala*_*man 0 ruby ruby-on-rails ruby-on-rails-3

在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
Run Code Online (Sandbox Code Playgroud)

产品控制器

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
Run Code Online (Sandbox Code Playgroud)

Mun*_*sim 7

4.times{ @product.photos.build }如果保存失败,请添加

更新您的创建操作,如:

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
Run Code Online (Sandbox Code Playgroud)

更新动作也需要同样的改变