articles_path 是如何工作的? (RubyOnRails 教程)

How does articles_path work? (RubyOnRails tutorial)

我正在关注 the official ruby on rails tutorial,我刚刚完成第 5.9 章。

添加 link 应该很简单,但我很困惑。

当我键入 bin/rake routes 时,我得到以下输出:

fl4m3ph03n1x: ~/blog $ bin/rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy
        root GET    /                            welcome#index
fl4m3ph03n1x: ~/blog $  

根据教程,这是有道理的。

利用这个,我有一个看法:

<h1>New Article</h1>

<%= form_for :article, url: articles_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

<%= link_to 'Back', articles_path %>

此视图有一个提交表单和一个 link 最后。 根据ruby,我在<%= form_for :article, url: articles_path do |f| %>中使用articles_path在表单中指定提交按钮link。

我真的不知道那个变量是怎么设置的,但我会上钩并接受它。 根据教程,点击提交按钮时articles_path默认为"POST /articles(.:format) articles#create"。

但是,在 link <%= link_to 'Back', articles_path %> 中,articles_path 应该将我们重定向到索引页面...

谁能解释一下为什么同一个变量在同一个视图中有两种截然不同的行为??

这背后有点神奇,表单生成器知道方法 http 方法将是 POST,而 url 将是 /articles。与开发编辑操作时相同,表单构建器将知道操作将 PATH/PUT 和 url 将是 /articles/1 因为您必须将文章实例传递给表单助手。

同样的魔法是 link_to 助手,他知道默认是 GET http 方法,除非您明确指定。

操作视图方法的工作原理:

link_to 默认请求类型为 'GET'.

button_to 默认请求类型为 'POST'.

每个生成的路由都有一个特定的类型,这就是 rails 将不同的请求映射到正确的请求的方式。

对于 form_for 操作视图辅助方法,它会根据您是否将实例传递给表单自动区分 'POST' 和 'PUT'。

您还可以通过添加

显式提供表单的方法类型
method: 'GET' OR :html => { :method => 'GET' }

** 根据 rails 版本检查不同的语法功能。

其他方法也是如此,所以如果你想link_to发送post请求,你必须将method="POST"传递给它。


**如何rails区分索引和显示操作**

在生成的路由中 table 您可能已经注意到索引操作不需要实例 ID,因为它应该列出所有文章。但是,为了显示,您需要将一个实例传递给它,因为它应该只显示一个特定的实例。

= link_to "index", articles_path
= link_to "show", article_path(article)

注意::

"articles"和"article"两种方法不一样,复数vs单数。即使它们的名称相同,其中一个会占用实例而另一个不会。

当您查看它生成的 HTML 输出时,您会理解得更好。

<%= form_for :article, url: articles_path do |f| %> 生成 HTML 输出如下

<form accept-charset="UTF-8" action="/articles/create" method="post">

所以表单提交给创建操作POST 请求。

当涉及到link_to时,默认的请求类型是GET.

<%= link_to 'Back', articles_path %> 生成的 HTML 输出将如下所示

<a href="/artcles">Back</a>

所以它会将您带到 索引页 因为它与 url请求类型.