我有一个叫做图书的资源.它在我的routes文件中正确地列为资源.

我有一个新的动作,它为新的观点提供了标准:

@book = Book.new

在模型上,有一些属性是通过状态验证的,因此如果保存操作失败,将生成错误.

在我的控制器中:

@book = Book.create
...  # some logic
if @book.save
  redirect_to(@book)
else
  render :new
end

这是相当标准的;使用render:new的基本原理是将对象传递回视图,并报告错误、重新填充表单条目等.

这是可行的,除了每次我被发送回表单(通过render:new)时,我的错误都会出现,但我的URL是索引URL,它是

/books

而不是

/books/new

我就是从这里开始的.我已经看过其他几篇关于这个问题的帖子,但都没有答案.至少,我们会假设它会将您置于/books/create,我也有一个视图文件(在本例中与new相同).

我可以做到:

# if the book isn't saved then
flash[:error] = "Errors!"
redirect_to new_book_path

那么,整本书的数据和整本书的数据都丢失了,等等.

为什么是render:new在/books上登陆我的索引操作,而通常URL调用index方法,该方法列出所有的书籍?

推荐答案

它实际上会将您发送到创建路径.它在create操作中,路径是/books,使用HTTP方法POST.这看起来与索引路径/books相同,但索引路径使用HTTP方法GET.rails路由代码在决定调用哪个操作时会考虑该方法.验证失败后,您仍处于创建操作中,但正在渲染new视图.这有点令人困惑,但像render :new这样的行实际上根本不会调用新操作;它仍在运行create操作,并告诉Rails渲染新的view.

Ruby-on-rails相关问答推荐

Gemfile需要较新版本的依赖项

如何使用继承类 (STI) 获取 Ruby on Rails 类中基类的实例

在 Rails 6.1 升级后,作业(job)规范使用 Minitest::UnexpectedError 包装错误

Ruby on Rails 7 与 React 集成

Selenium chromedriver:无法从不可键入的键构造KeyEvent

如何从 Ruby on Rails 应用程序返回正确的 HTTP 错误代码

如何在 Ruby on Rails 中创建一个锚点并重定向到这个特定的锚点

从 Authlogic 迁移到 Devise

Rails Mailer Net::OpenTimeout: execution expired 仅在生产服务器上出现异常

默认情况下,如何在 Rails 中使 cookie 安全(仅限 https)?

从控制器中删除 Cookie

了解 Rails 验证:allow_blank 有什么作用?

Rails data-disable-with re-enable 按钮

是否有不涉及删除 Gemfile.lock 的在任何源中找不到 *gem*错误的修复?

Rails:将所有未知路由重定向到 root_url

RubyMine - 关闭在空行中间单击的功能

如何在 ROR (Ruby) 中显示 PDF?

在 Ruby on Rails 中循环对象属性

Rails,设计认证,CSRF 问题

如何删除删除选项表单 activeAdmin?