xxx_url
等同于 xxx_path
先看rake routes
生成的路由
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
root | get | / | static_pages#home |
new_user | get | /users/new(.:format) | users#new |
edit_user | get | /users/:id/edit(.:format) | users#edit |
可以注意到new_user_url
与edit_user_url
对应的URI Pattern
很不一样的地方
edit_user_url
有一个/:id
,这是变化的,只要在views中给edit_user_url
传一个参数(user)
,会默认将user.id
传给controller,这样就能编辑指定的user
了。
那么,可以不传user.id吗?答案是可以,比如这样:
edit_user_url(user.name)
生成的链接是:
http://localhost:3000/users/Example%20User/edit
其中%20是空格的转义字符
这样做的可以把用户id隐藏起来
xxx_url
不仅仅可以修改传过去的参数 ,还可以增加参数,如下:
<%= edit_user_url(@user.name, email: @user.email, arg1: "arg1") %>
得到的是:
http://localhost:3000/users/Example%20User/edit?arg1=arg1&email=example%40railstutorial.org
%20和%40都是转义字符
后两个参数会变成查询参数,放在url的?
后面
在controller中,我们可以用以下方式获得参数的值注意params[:id]
params[:id] #=> "Example User"
params[:arg1] #=> "arg1"
params[:email] #=> "example@railstutorial.org"
为什么params[:id]
的值是@user.name
?应该是因为在routes中edit_user_url
对应的URI Pattern
中/users/:id/edit(.:format)
是:id
。