TechTalk

rails记录

字数统计: 556阅读时长: 2 min
2017/09/19

URL路由

当添加一条新的路由资源到routes.rb中:

1
2
resources testapp
resource testapp2

那么rails会生成如下7中url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@hadoop0 config]# rake routes
...
testapp_index GET /testapp(.:format) testapp#index
POST /testapp(.:format) testapp#create
new_testapp GET /testapp/new(.:format) testapp#new
edit_testapp GET /testapp/:id/edit(.:format) testapp#edit
testapp GET /testapp/:id(.:format) testapp#show
PATCH /testapp/:id(.:format) testapp#update
PUT /testapp/:id(.:format) testapp#update
DELETE /testapp/:id(.:format) testapp#destroy

testapp2 POST /testapp2(.:format) testapp2s#create
new_testapp2 GET /testapp2/new(.:format) testapp2s#new
edit_testapp2 GET /testapp2/edit(.:format) testapp2s#edit
GET /testapp2(.:format) testapp2s#show
PATCH /testapp2(.:format) testapp2s#update
PUT /testapp2(.:format) testapp2s#update
DELETE /testapp2(.:format) testapp2s#destroy

上述表格中的左侧一列是可以在views中或者controller中使用引用url的助记符,例如可以使用redirect testapp2_path代表重定向到/testapp2这个url上。 后面的testapp2s#create代表的是哪个控制器的那个函数被调到处理该时间,在这个例子上就是testapp2screate方法来处理GET请求。

可以使用exceptonly来排除哪些action和保留哪些action,例如:

1
2
resources :testapp, :only => [:index, :show]
resource :testapp2, :except => :destroy

如果在构建的url中存在多个id的情况,可以使用param来制定id的名称,例如

1
2
3
4
5
resources :task do
member do
resources :detail
end
end

会生成 /task/:id/detail/:id的URL但是在controller进行url渲染的时候,不能生成正确的url信息,所以这个路由信息需要如下改动
1
2
3
4
5
resources :task ,param: :task_id do
member do
resources :detail, param: :detail_id
end
end

这次,将会生成/task/:task_id/detail/:detail_id这样的url,这样在controller进行渲染的时候可以渲染出正确url

PUT vs POST

在HTTP中POST意味着创建一个新的对象,而PUT意味着是更新该对象操作。
由于web的form中的submit按钮会自动使用POST方法来推送消息,但是在实际场景中,form的数据可能是更新的情况,不应该使用POST消息,而是使用PUT消息,但是在form中的method即使修改为PUT后,浏览器自动忽略该行为,并自动修改为GET请求。
浏览器已经考虑了上述情况,做了工程实践上的妥协,添加如下标签后,该form的推送方法将使用PUT方式:

1
<input type='hidden' name='_method' value='PUT'>

或者是slim的代码
1
=f.text_field :name, type: 'hidden', name: '_method', value:'PUT'

CATALOG
  1. 1. URL路由
    1. 1.1. PUT vs POST