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。