2010-04-14 33 views
20

Tôi đang đọc hai trang nàyLàm cách nào để thêm tuyến đường RESTful tùy chỉnh vào ứng dụng Rails?

  1. resources
  2. Adding more RESTful actions

Trang Rails Hướng dẫn cho thấy

map.resources :photos, :new => { :upload => :post } 

Và URL tương ứng của nó

/photos/upload 

Điều này có vẻ tuyệt vời.


My routes.rb chương trình này

map.resources :users, :new => { :signup => :get, :register => :post } 

Khi tôi làm: [~/my_app]$ rake routes

tôi thấy hai tuyến đường mới được bổ sung

signup_new_user GET /users/new/signup(.:format) 
register_new_user POST /users/new/register(.:format) 

Note sự bao gồm của /new! Tôi không muốn điều đó. Tôi chỉ muốn /users/signup/users/register (như được mô tả trong Hướng dẫn định tuyến đường ray).

Bất kỳ trợ giúp nào?

Trả lời

61

Khi bạn tiếp xúc với một bộ điều khiển như một nguồn lực, hành động sau đây sẽ được tự động thêm vào:

show 
index 
new 
create 
edit 
update 
destroy 

Những hành động này có thể được phân loại thành hai nhóm:

  • :member hành động

URL cho hành động thành viên có id của tài nguyên đích. E.g:

users/1/edit 
users/1 

Bạn có thể nghĩ :member hoạt động như một phương pháp thể hiện trên lớp học. Nó luôn luôn áp dụng trên một nguồn tài nguyên hiện có.

hành động mặc định thành viên: show, edit, update, destroy

  • :collection hành động

URL cho :collection hành động không chứa id của tài nguyên mục tiêu. Ví dụ:

users/login 
users/register 

Bạn có thể nghĩ :collection hoạt động như một phương pháp tĩnh trên lớp học.

hành động bộ sưu tập mặc định: index, new, create

Trong trường hợp của bạn, bạn cần hai hành động mới để đăng ký. Những hành động này thuộc về: loại bộ sưu tập (vì bạn không có id của người dùng trong khi gửi các hành động này). Tuyến đường của bạn có thể thực hiện như sau:

map.resources :users, :collection => { :signup => :get, :register => :post } 

URL cho những hành động như sau:

users/signup 
users/register 

Nếu bạn muốn loại bỏ một hành động tiêu chuẩn được tạo ra bởi Rails sử dụng: trừ /: chỉ lựa chọn:

map.resources :foo, :only => :show 

map.resources :foo, :except => [:destroy, :show] 

Sửa 1

tôi thường t hành động confirmation dưới dạng hành động :member. Trong trường hợp này params[id] sẽ chứa mã xác nhận.

Route cấu hình:

map.resources :users, :member => { :confirm => :get} 

URL

/users/xab3454a/confirm 

confirm_user_path(:id => @user.confirmation_code) # returns the URL above 

khiển

class UsersController < ApplicationController 
    def confirm 
    # assuming you have an attribute called `confirmation_code` in `users` table 
    # and you have added a uniq index on the column!! 
    if User.find_by_confirmation_code(params[id]) 
     # success 
    else 
     # error 
    end 
    end 
end 
+0

@KandadaBoggu, lời giải thích này trông tuyệt vời. Theo dõi để kiểm tra sự hiểu biết của tôi, nói rằng tôi muốn gửi liên kết "xác nhận tài khoản" trong email chào mừng của người dùng. Liên kết đó sẽ chứa băm xác thực 8 ký tự. Tôi có thêm 'map.resources: users,: member => {: validate =>: get}' không? Tham số 'băm' được cắm vào như thế nào? –

+0

Cập nhật câu trả lời của tôi, hãy xem. –

+0

Điều gì đang nói 'confirm_user_path' để sử dụng' @ user.confirmation_code' thay cho ký tự đại diện ': id' thay vì' @ user.foo' hoặc '@ user.bar'? Nếu đây là 'confirm_user_path (: id => @ user.confirmation_code)'? –

1

Tùy chọn new cho phép bạn tạo các tuyến mới để tạo đối tượng mới. Đó là lý do tại sao chúng được bắt đầu bằng thuật ngữ đó.

Điều bạn đang tìm kiếm là tùy chọn :collection.

map.resources :users, :collection => { :signup => :get, :register => :post } 

Điều này sẽ tạo ra các url /users/signup/users/register.

+0

Tôi gặp khó khăn khi hiểu 'bộ sưu tập' được dùng để làm gì. Tuyến đường ** là ** để tạo đối tượng mới; khách truy cập đăng ký tạo đối tượng 'Người dùng' mới. Vì vậy, tại sao tôi không muốn sử dụng 'mới'? Đây có phải là lỗi đánh máy trong Hướng dẫn Rails không? –

3

Nếu tôi hiểu đúng câu hỏi của bạn, bạn chỉ muốn đổi tên các url của các hành động newcreate.

này sẽ được thực hiện như sau:

map.resources :users, :path_names => {:new => 'signup', :create => 'register'} 

Nếu bạn thực sự muốn thêm tuyến đường mới tương ứng với các hành động điều khiển, sau đó Damiens Câu trả lời là con đường để đi.

+0

@mikezter, tôi chắc chắn vẫn cần các tuyến 'mới' và' tạo'. Tuy nhiên, câu trả lời này tôi đặt câu hỏi về * đổi tên * tuyến đường mà tôi đã có trong quá khứ. Cảm ơn :) –

12

này có thể được thực hiện như là jus t một cú pháp khác - điều tốt đẹp để biết có thể là.

Cú pháp 1:

resources :users do 
    member do 
    get 'signup' 
    post 'register' 
    end 
end 

Rake Route Output sẽ bao gồm

signup_users GET /users/signup(.:format) {:action=>"signup", :controller=>"users"} 
register_users POST /users/register(.:format) {:action=>"register", :controller=>"use 

rs "}

Cú pháp 2: Nếu bạn chỉ có một tuyến đường bộ sưu tập

resources :users do 
    get 'signup', :on => :collection 
end 
+0

Tôi thích cú pháp 2, awnser đẹp – Francois

Các vấn đề liên quan