【发布时间】:2013-01-07 13:05:08
【问题描述】:
我有一个名为 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 数据以及错误消息都会丢失,这就是拥有表单和操作等的全部意义。
为什么当通常该 URL 调用列出所有书籍的 INDEX 方法时,render :new 将我登录到 /books,我的索引操作?
【问题讨论】:
-
它不会让您进入 /books/new,因为您是通过发布到 /books/ 创建资源的,当它失败时它只是呈现新操作,而不是将您重定向到新操作跨度>
-
试试
redirect_to new_book_path(book: params[:book]) -
@Doon 是对的(他应该把它作为一个答案,这样我就可以投票了:))。在 REST 的“Rails 视图”中创建操作没有可视化,因此是正常的重定向。这里的错误网址有什么问题?
-
@MrYoshiji 关闭,但没有雪茄......这给了我一个带有 /books/new/book%skldjalkdja 的 URL(我相信与图书 ID 本身有关的乱码)。 /book/new 怎么样?
标签: ruby-on-rails forms view controller routes