2011-10-12 33 views
19

Tôi đang cố gắng thay đổi tuyến đường ray từ/người dùng/1 thành/tên người dùng. Tôi hiện đang thiết lập để nó hoạt động cho các hành động hiển thị và chỉnh sửa. Vấn đề thực tế là khi tôi đi để cập nhật người dùng bằng cách sử dụng:Đường ray đến tên người dùng thay vì id

<%= form_for @user do |f|%> 

Nó không bao giờ cập nhật, vì hành động cập nhật được chuyển đến/người dùng /: id. Có cách nào để tuyến đường này để nó hoạt động cho/tên người dùng? (đó là tuyến đường được hiển thị trong biểu mẫu của tôi dưới dạng hành động). Tôi đã gãi đầu của tôi trong một thời gian này.

CHỈNH SỬA:

Vấn đề không định tuyến cho tên người dùng, nó hoạt động chính xác. Vấn đề là biểu mẫu định tuyến đến/tên người dùng để cập nhật, tuy nhiên tuyến đường cập nhật cho người dùng vẫn là/users /: id thay vì:/id.

tôi đã cố gắng cập nhật các tuyến đường của tôi với điều này, nhưng không có kết quả:

match '/:id', :to => "users#show", :as => :user 
match '/:id', :to => "users#update", :as => :user, :via => :put 
match '/:id', :to => "users#destroy", :as => :user, :via => :delete 

EDIT:

Doh! Đây cố định vấn đề:

match '/:id', :to => "users#show", :as => :user, :via => :get 

Trả lời

32

Trong mô hình sử dụng của bạn:

def to_param 
    username 
end 

Phương pháp to_param trên ActiveRecord các đối tượng sử dụng, theo mặc định, chỉ cần ID của đối tượng. Bằng cách đặt mã này vào mô hình của bạn, bạn sẽ ghi đè mặc định ActiveRecord, vì vậy khi bạn liên kết với Người dùng, nó sẽ sử dụng số username cho thông số thay vì id.

17

Trong mô hình Người dùng, hãy ghi đè phương thức to_param để trả về những gì bạn muốn được sử dụng trong URL.

class User < ActiveRecord::Base 
    def to_param 
    username 
    end 
end 

Trong điều khiển của bạn thay vì sử dụng User.find(params[:id]) bây giờ bạn cần phải sử dụng User.find_by_username(params[:id])

+1

nó sẽ được tốt hơn để xác định 'param:: username' trong các tuyến đường f ile? Vì param không nên được gọi là ': id' nữa, nhưng thay vào đó nó sẽ được gọi là': username' –

0

Bạn không cần phải ghi đè to_param nếu bạn không muốn, bạn chỉ có thể chỉ định trong thẻ biểu mẫu như thế này :

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%> 
Các vấn đề liên quan