2011-10-13 37 views
10

Vì vậy, hiện tại tôi có một cái gì đó như/người dùng/1/khi tôi muốn xem hồ sơ người dùng. Dunno mức độ dễ hay phổ biến của câu hỏi này, tôi là một chút của Rails noob vào thời điểm này, nhưng làm thế nào tôi có thể đi qua routes.rb để thay đổi điều đó thành/user/chiggins/nơi chiggins là một tên người dùng duy nhất?Đường ray Tuyến đường dựa trên một cái gì đó khác với ID

Cảm ơn nhiều!

Trả lời

13

Bạn cần là để ghi đè to_param phương pháp trong mô hình tài:

class User 
    def to_param 
    username 
    end 
end 

Sau đó, đường ray sẽ sử dụng nó automagically cho việc định tuyến. Xem http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

Được rồi, tôi đã thêm chút ít vào, nhưng tôi gặp phải lỗi sau: http://chigstuff.com/uploads/user_error.jpg – Chiggins

+0

Nevermind, tôi đã tìm thấy sự cố của mình. Phương thức hiển thị của tôi đã làm "@user = User.find (: params [: id])", tôi đã thay đổi nó để tìm kiếm theo tên người dùng. – Chiggins

+0

Thay đổi mã trong bộ điều khiển của bạn: không phải User.find (params [: id]) nhưng User.find_first_by_username (params [: id]) hoặc thay đổi nội dung của to_param thành "# {self.id} - # {self.username}" –

0

Cách tốt nhất là để xác định một con đường với một param tùy chỉnh:

match "https://stackoverflow.com/users/:username" => "users#show" 

Trong điều khiển của bạn, các params cũ đồng bằng [: id] sẽ params [: username], và bạn có thể nhận được người sử dụng từ de DB sử dụng:

User.find_by_username(params[:username]) 
+0

Tôi chỉ cần thêm dòng đầu tiên vào routes.db của mình, thay vì sử dụng: username Tôi vẫn được yêu cầu sử dụng: id – Chiggins

1

Bạn có thể nhận mỗi Resource Identifier cu stomization bằng cách xác định lại các phương thức member_scope và nested_scope trên cá thể Resource.

resources :users do 
    @scope[:scope_level_resource].tap do |u| 
    def u.member_scope 
     "#{path}/:username" 
    end 

    def u.nested_scope 
     "#{path}/:#{singular}_username" 
     # member_scope also usable here, assuming username will be nowhere in nested routes. 
    end 
    end 
end 

Về câu hỏi về #nested_scope dưới đây: Nó được sử dụng khi bạn làm điều gì đó như thế này trong định tuyến:

resources :members do 
    resources :playlists, only: :index 
end 

Sau đó, param sẽ là: member_username thay vì chỉ: username. Điều này rất hữu ích trong bộ điều khiển danh sách phát khi lắp ráp bộ sưu tập để bạn có thể phỏng đoán phạm vi yêu cầu.

+0

Tôi hiểu "# {path} /: username", để tạo các tuyến được tạo tự động, nhưng tôi không 't hiểu những gì có nghĩa là "nested_scope" phương pháp ?! – Matrix

+0

Xem câu trả lời cập nhật @Matrix. – 20man

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