articles_path如何工作? (RubyOnRails教程)

时间:2015-07-25 16:07:57

标签: ruby-on-rails ruby view

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

添加链接应该很简单但我很困惑。

当我输入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 %>

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

我真的不知道该变量是如何设置的,但我会接受诱饵并接受它。 根据教程,单击提交按钮articles_path将默认为“POST /articles(.:format)文章#create”。

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

有人可以解释一下,同一个变量在同一个视图中有两种截然不同的行为吗?

3 个答案:

答案 0 :(得分:3)

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

link_to 默认请求类型为“GET”。

button_to 默认请求类型为“POST”。

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

对于form_for动作视图辅助方法,它会自动区分“POST”和“PUT”,具体取决于您是否将实例传递给表单。

您还可以通过添加

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

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

与其他方法相同,因此如果您希望link_to发送帖子请求,则必须将method="POST"传递给它。

** rails如何区分索引和show actions **

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

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

注意::

两种方法不一样,“文章”和“文章”,复数与单数。即使它们的名称相同,其中一个会占用一个实例而另一个则不会。

答案 1 :(得分:2)

当您查看它生成的 HTML 输出时,您可以更好地理解。

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

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

所以 表单 使用 POST 提交 创建操作 em> 请求。

说到link_to,默认请求类型为 GET

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

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

因此它会带您进入 索引页 ,因为它与 网址 <匹配em>请求类型

答案 2 :(得分:0)

后面有点魔法,表单生成器知道方法http方法将是POST,url将是/ articles。与开发编辑操作时相同,表单构建器将知道PATH / PUT和url将是/ articles / 1的操作,因为您必须传递文章的实例以形成帮助器。

相同的魔法是link_to helper他知道默认是GET http方法,除非你准确指定。