已经有这个了很多问题,但他们都不来帮忙。 是的,我看过这个导轨投 。
我有谁有很多书,像这样的作者:
作者:
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后者 - 依然无果。
谢谢你的帮助!
让我们通过它一步。
您提交的创建,并进入你的创造行动
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 %>
在图书控制器/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 %>