Рендеринг сообщений об ошибках для form_tag, который создает несколько объектов? - PullRequest
2 голосов
/ 15 декабря 2011

Я не уверен, как отображать сообщения об ошибках для моей формы при использовании ее в этом form_tag сценарии. Приведенный ниже код позволяет мне одновременно создавать 5 продуктов в форме, но, к сожалению, только уведомляет, что «произошла ошибка ...».

Вот мой код:

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. Как я мог это сделать?

Спасибо.

1 Ответ

7 голосов
/ 16 декабря 2011

Я пытался сделать то же самое, с этим:

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

Однако это показывает только ошибки для first продукта с ошибками. Вы отправляете его, и если последующий продукт с ошибками возвращается на эту страницу, а следующий продукт с ошибками показывает ошибки и т. Д.

РЕДАКТИРОВАТЬ: Понял. Это связано с тем, как я проверял. Вместо этого:

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

сделать это:

@products.each(&:valid?) # run the validations
if @products.all? { |t| t.errors.empty? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...