我关注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
应该将我们重定向到索引页...
有人可以解释一下,同一个变量在同一个视图中有两种截然不同的行为吗?
答案 0 :(得分:3)
link_to
默认请求类型为“GET”。
button_to
默认请求类型为“POST”。
每个生成的路由都有一个特定的类型,这就是rails将不同的请求映射到正确的请求的方式。
对于form_for
动作视图辅助方法,它会自动区分“POST”和“PUT”,具体取决于您是否将实例传递给表单。
您还可以通过添加
显式提供表单的方法类型method: 'GET' OR :html => { :method => 'GET' }
**根据rails版本检查不同的语法功能。
与其他方法相同,因此如果您希望link_to
发送帖子请求,则必须将method="POST"
传递给它。
在生成的路由表中,您可能已经注意到索引操作不需要实例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方法,除非你准确指定。