我有一个名为 Books 的资源。它在我的路线文件中正确列为资源。
我有一个新动作,它为新视图提供了标准:
@book = Book.new
在模型上,有一些属性是通过存在来验证的,所以如果保存操作失败,就会产生错误。
在我的控制器中:
@book = Book.create
... # some logic
if @book.save
redirect_to(@book)
else
render :new
end
这是相当标准的;并且使用 render:new 的基本原理是将对象传递回视图,并且可以报告错误,重新填写表单条目等。
这有效,除非每次我被发送回表单(通过渲染:new),我的错误都会出现,但我的 URL 是 INDEX URL,即
/books
而不是
/books/new
这是我最初开始的地方。我看过其他几个关于这个问题的帖子,但没有答案。至少,有人会假设它会将您带到 /books/create,我也有一个视图文件(在这种情况下与 new 相同)。
我可以做这个:
# if the book isn't saved then
flash[:error] = "Errors!"
redirect_to new_book_path
但是随后@book 数据以及错误消息都会丢失,这就是拥有表单和操作等的全部意义所在。
为什么 render :new 会在我的索引操作 /books 登陆我,而通常该 URL 会调用列出所有书籍的 INDEX 方法?