# [Rails4][path][routes]routes與路徑相關筆記
###### tags: `Rails4`,`path`,`routes`
## helper相關
### url_for
https://apidock.com/rails/ActionView/RoutingUrlFor/url_for
### 將path做為參數傳入link_to helper
#### view
```htmlmixed!
<%
extra_params={
cat_id: 2,
a: 10,
b: 20,
c: 30,
}
path= Proc.new{|i| url_for(
{
controller: "products",
action: "edit",
id:i,
}.merge(extra_params)
)}
%>
```
產生html如下:
```htmlmixed!
<a class="some class" href="/products/2/edit?a=10&b=20&c=30&cat_id=2">test link</a>
```
## 網址路徑相關
### request methods 查詢:
https://edgeapi.rubyonrails.org/classes/ActionDispatch/Request.html
### 取得網頁根網址
https://stackoverflow.com/questions/21321687/rails-get-app-root-base-url/29341735
```ruby
request.base_url
```
### 取得目前網頁網址(不含domain)
https://stackoverflow.com/questions/2165665/how-do-i-get-the-current-absolute-url-in-ruby-on-rails
```ruby
request.original_fullpath
```
### 取得目前網頁完整網址(包含domain)
```ruby
request.original_url
#或
+request.original_fullpath
```
### 取得相對路徑
https://stackoverflow.com/questions/20181216/how-to-get-the-current-route-in-rails
```ruby
request.path
```
---
## routes相關設定
>rails的routes位於config/routes.rb
### 設定首頁
```ruby=
root "welcome#index"
```
### 自訂傳入id參數名稱
```ruby=
resources :kkk,param: :kkk_id
```
產生路徑:
```terminal
kkk_index GET /kkk(.:format) kkk#index
POST /kkk(.:format) kkk#create
new_kkk GET /kkk/new(.:format) kkk#new
edit_kkk GET /kkk/:kkk_id/edit(.:format) kkk#edit
kkk GET /kkk/:kkk_id(.:format) kkk#show
PATCH /kkk/:kkk_id(.:format) kkk#update
PUT /kkk/:kkk_id(.:format) kkk#update
DELETE /kkk/:kkk_id(.:format) kkk#destroy
```
### 使用member產生帶參數的自訂路徑
config/routes.rb
```ruby
resources :test do
get "t1",on: :member
#上述寫法也可改為:
#member do
# get "t1"
#end
end
```
產生路徑:
```terminal
t1_test GET /test/:id/t1(.:format) test#t1 <==注意此行
test_index GET /test(.:format) test#index
POST /test(.:format) test#create
new_test GET /test/new(.:format) test#new
edit_test GET /test/:id/edit(.:format) test#edit
test GET /test/:id(.:format) test#show
PATCH /test/:id(.:format) test#update
PUT /test/:id(.:format) test#update
DELETE /test/:id(.:format) test#destroy
```
### 使用collection產生無參數的自訂路徑
config/routes.rb
```ruby
resources :test do
get "t1",on: :collection
#上述寫法也可改為:
#collection do
# get "t1"
#end
end
```
產生路徑:
```
t1_test_index GET /test/t1(.:format) test#t1 <==注意此行
test_index GET /test(.:format) test#index
POST /test(.:format) test#create
new_test GET /test/new(.:format) test#new
edit_test GET /test/:id/edit(.:format) test#edit
test GET /test/:id(.:format) test#show
PATCH /test/:id(.:format) test#update
PUT /test/:id(.:format) test#update
DELETE /test/:id(.:format) test#destroy
```
### member搭配only
config/routes.rb
```ruby=
resources :cats ,only:[:index] do
get "products",on: :member
resources :subcats,only:[:index] do
get "products",on: :member,param: :subcat_id
end
end
```
產生路徑:
```terminal!
products_cat GET /cats/:id/products(.:format) cats#products
products_cat_subcat GET /cats/:cat_id/subcats/:id/products(.:format) subcats#products {:param=>:subcat_id}
cat_subcats GET /cats/:cat_id/subcats(.:format) subcats#index
cats GET /cats(.:format) cats#index
```
>與only相反的參數是except
### view可直接將物件做為參數傳入
假設路徑如下:
```terminal
products_cat GET /cats/:id/products(.:format) cats#products
```
路徑是預設接受一個id參數,但在view中可以直接將物件做為參數傳入:
```htmlmixed=
<%= link_to products_cat_path(cat) do %>
<%=cat.name%>
<% end%>
```
在cats_controller內的products action使用render plain:params檢視參數,
印出的結果如下:
```htmlmixed=
{"controller"=>"cats", "action"=>"products", "id"=>"1"}
```
若需要傳入兩個id參數,可傳入兩個物件:
```htmlmixed=
<%= link_to products_cat_subcat_path(cat,subcat) do %>
<%=subcat.name%>
<% end %>
```
檢視參數結果:
```htmlmixed=
{"controller"=>"subcats", "action"=>"products", "cat_id"=>"1", "subcat_id"=>"2"}
```
### 自訂path名稱:使用as
https://stackoverflow.com/questions/1436309/how-to-define-a-custom-path-in-rails
```ruby=
post "/ttt/:id/action",to: "conrtoller_name#action_name",as: "ttt_action"
```
上面的路由path名稱為ttt_action_path
### 顯示特定routes
```c!
$ rake routes | grep keywords_u_wanna_search
```
## 轉址相關
### 轉至特定網址