【问题标题】:How does articles_path work? (RubyOnRails tutorial)article_path 是如何工作的? (RubyOnRails 教程)
【发布时间】:2015-07-25 16:07:57
【问题描述】:

我正在关注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,我在&lt;%= form_for :article, url: articles_path do |f| %&gt;中使用articles_path在表单中指定提交按钮链接。

我真的不知道这个变量是如何设置的,但我会接受它。 根据教程,点击提交按钮articles_path时默认为“POST /articles(.:format)articles#create”。

但是,在链接&lt;%= link_to 'Back', articles_path %&gt;articles_path 应该将我们重定向到索引页面...

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

【问题讨论】:

    标签: ruby-on-rails ruby view


    【解决方案1】:

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

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

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

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

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

    您还可以通过添加显式提供表单的方法类型

    method: 'GET' OR :html => { :method => 'GET' }
    

    ** 根据 Rails 版本检查不同的语法能力。

    其他方法也是如此,因此如果您希望link_to 发送发布请求,您必须将method="POST" 传递给它。


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

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

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

    注意 ::

    这两种方法不一样,“articles”和“article”,复数vs单数。即使它们的名称相同,它们中的一个也会作为实例,而另一个则不会。

    【讨论】:

    • 我如何知道我发送的 GET 请求是用于索引、显示、新建还是编辑?
    • 我更新了我的答案检查第二部分。尝试阅读生成的路线,这会给你更多的见解和解释。
    • "这两种方法不一样,"articles" 和 "article",复数 vs 单数。"这对我很有帮助。
    【解决方案2】:

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

    &lt;%= form_for :article, url: articles_path do |f| %&gt; 生成 HTML 输出如下所示

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

    所以 form 使用 POST 提交到 create 操作 em> 请求。

    对于link_to,默认的请求类型是GET

    &lt;%= link_to 'Back', articles_path %&gt; 生成的HTML 输出如下所示

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 1970-01-01
        • 2016-12-03
        • 2019-02-14
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        相关资源
        最近更新 更多