2011-12-15 48 views
2

我不知道如何在此form_tag方案中使用它时显示我的表单的错误消息。我的下面的代码允许我一次在表单上创建5个产品,但不幸的是只会呈现“发生错误...”的通知。为form_tag创建多个对象的渲染错误消息?

这里是我的代码:

Product.rb

class Product < ActiveRecord::Base 
    attr_accessible :price, :name, :purchase_date, :product_store, :in_category 
    belongs_to :user 
    belongs_to :store 
    attr_reader :product_store 
    validates_inclusion_of :in_category, :in => [true, false] 
    validates_presence_of :name, :price, :store_id, :user_id 
    validates_numericality_of :price 

    def product_store=(id) 
    self.store_id = id 
    end 
end 

Products_controller.rb

class ProductsController < ApplicationController 

    def new 
    @products = Array.new(5) { Product.new } 
    end 

    def create_multiple 
    @products = current_user.products.create(params[:products].map { |_k, p| p.merge params[:product] }) 
    if @products.each(&:save) 
     redirect_to :back, :notice => "Success!" 
    else 
     redirect_to :back, :notice => "An error occured, please try again." 
    end 
    end 
end 

Form.html.erb

<%= form_tag create_multiple_products_path, :method => :post do %> 
    <%= error_messages_for @product %> 

     # the :purchase_date and :in_category are merged into all 5 Products. 

      <%= date_select("product", "purchase_date") %> 

      <%= label_tag :in_category, 'Add to Category?' %> 
       <%= radio_button("product", :in_category, 1) %> 
       <%= radio_button("product", :in_category, 0) %> 

      <% @products.each_with_index do |product, index| %> 
       <%= fields_for "products[#{index}]", product do |p| %> 
        <%= render "fields", :f => p %> 
       <% end %> 
      <% end %> 

     <%= submit_tag "Done" %> 
<% end %> 

他们的2个问题。 1.对fields_for以外的字段进行验证以显示.2。然后是fields_for中的那些。我怎么能这样做?

谢谢。

回答

6

我一直试图做同样的事情,这一点:

<% @products.each_with_index do |product, index| %> 
     <% product.errors.full_messages.each do |value| %> 
     <li><%= value %></li> 
     <% end %> 

然而,这只能说明了第一产品有错误的错误。你提交它,如果后面的产品有错误,你会被发回到该页面,并且下一个有错误的产品显示错误等。

编辑:明白了。这与我如何验证有关。取而代之的是:

if @products.all?(&:valid?) 

做到这一点:

@products.each(&:valid?) # run the validations 
if @products.all? { |t| t.errors.empty? } 
+1

岂不`@ products.map(:有效吗?)所有`有点清洁。?不像`@ products.all?(&:valid?)`,它会验证所有产品,然后检查它们是否全部有效。 `@ products.all?(&:valid?)`的问题是,它会一直运行到第一个无效记录。 – 2011-12-24 19:29:31