【问题标题】:The action path of a form in RailsRails 中表单的动作路径
【发布时间】:2021-07-13 23:31:36
【问题描述】:

下面的解释很大,但问题真的很简单。

我在https://www.theodinproject.com/paths/full-stack-ruby-on-rails/courses/ruby-on-rails/lessons/forms做一个简单的表单项目。

我的第一部分,我需要手动构建一个表单——这样当我使用它的辅助方法时,我可以看到 Rails 为我做了很多事情。 我被困在这一点上:

在您的标签中指定方法和操作属性(使用 $ rails 路由根据您创建的资源查看预期的 HTTP 方法和路径)。

routes.rb 文件如下所示:

资源:用户,仅限:[:create, :new]

我不知道如何确定我应该对表单使用哪种方法 - 发布或获取。 我不知道如何确定应该使用哪个操作路径。

我已经上网,Rails 指南等,并且到目前为止已经解决了其他主题,但是对于这个我无法通过它。

到目前为止我的表格:

<form action='/create' method="post" accept-charset="UTF-8"> 
<label for="username"></label>
<input type="text" id="username" name="username"><br>
<label for="email"></label>
<input type="text" id="email" name="email"><br>
<label for="password"></label>
<input type="text" id="password" name="password"><br>
<input type="submit" id="submit" value="Submit" >
</form>

一旦我在服务器上运行它,然后提交表单——我做了——我应该得到:

“提交您的表单并查看服务器输出。糟糕,我们没有正确的 CSRF 真实性令牌 (ActionController::InvalidAuthenticityToken) 来防止跨站点脚本攻击和表单劫持。如果您没有收到错误,您使用了步骤 1 中的错误方法。”

【问题讨论】:

  • 如果您使用表单构建器,rails 将为您处理真实性令牌Form Helpers
  • 就是这样。我首先在 HTML 中手动进行。我当时遇到的问题不是CSRF,而是实际上如何确定form标签的action path属性和method属性。请你帮我解决一下好吗?
  • 你已经把那部分弄对了。 &lt;form action='/create' method="post" accept-charset="UTF-8"&gt;您的错误是下面的帖子将帮助解决的令牌。话虽如此,我不确定您为什么要“在 HTML 中手动执行”,因为这不是在 Rails 中开发时的普遍做法,而且老实说,代码审查员可能会不赞成。
  • 如果您只是问我如何查看重新创建的路由,然后打开终端导航到应用程序的根目录并输入rake routes,这将显示 HTTP 动词、路由名称、处理此请求的控制器#action

标签: ruby-on-rails ruby forms


【解决方案1】:

是的,Rails 很聪明)当你向服务器发送请求时,Rails 必须知道这个请求来自哪里。简而言之,如果你的表单发送了 CSRF 令牌,那么 Rails 就知道你发送了这个请求,否则其他人代表你发送了这个请求(CSRF 攻击)。

要修复此错误,您需要在 .erb 视图中设置 &lt;%= form_authenticity_token %&gt;。它将生成以下输入

<input type="hidden" name="authenticity_token" value="your_token_generate_by_rails">

或者为了您的测试目的,您可以在处理您的请求的控制器中使用它。但是,如果您不知道自己在做什么,以后永远不要使用它)

skip_before_action :verify_authenticity_token

【讨论】:

  • 感谢您的回复!是的,我得到了关于 CSRF 的部分。在完成指定表单的动作路径属性和方法属性的部分后,我将插入它。但是,Idk 如何确定它们。你能帮帮我吗?
  • @caiosa 哦,如果你想确定它们而不是在控制台 rake 路由中运行,你会看到你的应用程序路由
  • 太棒了,谢谢!我这样做了。如何选择哪个是正确的?
  • 如果你想保存的东西比你需要使用 POST 方法,如果你想检索资源而不是 GET,更多信息你应该阅读这个guides.rubyonrails.org/routing.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多