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

时间:2013-06-24 03:08:14

标签: ruby-on-rails ruby 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

产品控制器

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

1 个答案:

答案 0 :(得分: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

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