嵌套模型验证 - 错误不显示(Nested model validation - errors do

2019-08-01 16:26发布

已经有这个了很多问题,但他们都不来帮忙。 是的,我看过这个导轨投 。

我有谁有很多书,像这样的作者:

作者:

class Author < ActiveRecord::Base
  attr_accessible :name
  has_many :books, dependent: :destroy

  accepts_nested_attributes_for :books, allow_destroy: true

  validates :name, presence: true
  validates :name, length: { minimum: 3 }
end

书:

class Book < ActiveRecord::Base
  attr_accessible :name, :year
  belongs_to :author

  validates :name, :year, presence: true
  validates :year, numericality: { only_integer: true, less_than_or_equal_to: Time.now.year }
end

我创建了下面的表格一本书添加到作者的作者#显示:

<%= form_for([@author, @book], html: { class: "well" }) do |f| %>
<% if @book.errors.any? %>
    <div class="alert alert-block">
        <ul>
            <% @author.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>
#labels and buttons...
<% end %>

......用以下方法authors_controller:

def show
    @author = Author.find(params[:id])
    @book = @author.books.build
end

...及以下books_controller方法:

def create
    @author = Author.find(params[:author_id])
    if @author.books.create(params[:book])
      redirect_to author_path(@author)
    else
      render action: :show
    end
  end

我似乎无法找出原因,形式不显示任何错误消息。 我跟着从railscasts的例子,他们说那里应该有形式,而不是@ author.books.build书的实例变量,所以我把在形式的控制器和@book后者 - 依然无果。

谢谢你的帮助!

Answer 1:

让我们通过它一步。

您提交的创建,并进入你的创造行动

def create
  @author = Author.find(params[:author_id])
  if @author.books.create(params[:book])
    redirect_to author_path(@author)
  else
    render action: :show
  end
end

(侧面说明,如果没有找到@author,你不处理这种情况。)

现在,作者被发现,但@ author.books.create失败(返回false),让你渲染表演动作。

它使用展示模板,但不调用show动作代码。 (附注,也许新的页面将是一个更好的选择,这样用户就可以再次尝试创建。)

此时@author进行实例化,你找到了作者,但不@book。 所以@book,如果所谓的将是零。

你的节目模板确实

if @book.errors.any?

这不会是真的,所以如果里面的模板的其余部分将被跳过。 这就是为什么没有错误。

你并不需要的form_for显示错误消息。 如果您切换到使用新的模板,然后将有再次尝试的一种形式。

因此,让我们切换到新的渲染。

Class BooksController < ApplicationController
  def new
    @author = Author.find(params[:author_id])
    @book = @author.books.build
  end

  def create
    @author = Author.find(params[:author_id])
    @book = @author.books.build(params[:book])
    if @author.save
      redirect_to author_path(@author)
    else
      render action: :new
    end
  end

新模板会

<% if @author.errors.any? %>
    <div class="alert alert-block">
        <ul>
            <% @author.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>
<% if @book.errors.any? %>
    <div class="alert alert-block">
        <ul>
            <% @book.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>

<%= form_for([@author, @book], html: { class: "well" }) do |f| %>
#labels and buttons...
<% end %>


Answer 2:

在图书控制器/books_controller.rb

def new
   @author = Author.find_by_id(params[:author_id])
   @book = @author.books.build
end

def create 
   @author = Author.find_by_id(params[:author_id])
   if @author
     @book = @author.books.build(params[:book])
     if @book.save
       flash[:notice] = "Book saved successfully"
       redirect_to author_path(@author)
     else
       render :new
     end
  else
   flash[:notice] = "Sorry no author found"
   redirect_to author_path
  end 
end

如果作者不存在重定向到作者的索引页面错误信息不呈现新的形式,你不能就能够建立图书形成如图作者是零。

而在你的书的新形式,你可以有书列出的错误

/books/new.html.erb

  <% if @book.errors.any? %>
    <div class="alert alert-block">
      <ul>
         <% @books.errors.full_messages.each do |msg| %>
             <li><%= msg %></li>
         <% end %>
     </ul>
   </div>
 <% end %>


文章来源: Nested model validation - errors don't show