2011-10-12 33 views
19

我試圖改變從/用戶/ 1到/用戶名的鐵路路由。我現在設置這個,所以適用於顯示和編輯的操作。實際的問題是,當我去通過更新用戶:Rails路由到用戶名,而不是id

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

它從來沒有更新,因爲更新動作被路由到/用戶/:ID。有沒有什麼辦法可以讓它適用於/ username? (這是在我的表單中呈現爲行動的路線)。現在我一直在摸索這個問題。

編輯:

的問題不是路由到用戶名,它正常工作。問題是表單路由到/更新的用戶名,但用戶的更新路由仍然是/ users /:id而不是:/ id。

我試圖更新我的路線,這一點,但無濟於事:

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 

編輯:

衛生署!這解決了該問題:

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

回答

32

在用戶模式:

​​

上的ActiveRecord的to_param方法對象的用途,默認情況下,物體的只是ID。通過將此代碼放入模型中,您將覆蓋ActiveRecord的默認設置,因此當您鏈接到用戶時,它將使用參數username代替id

17

在用戶模型中,覆蓋to_param方法以返回您想在URL中使用的內容。

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

在你的控制,而不是使用User.find(params[:id])你現在需要使用User.find_by_username(params[:id])

+1

它會更好用'PARAM:username'的路線˚F ILE?因爲param不應該被稱爲':id',而應該被稱爲':username' –

0

你不必重寫to_param如果你不想,你可以在這樣的表單標籤只需指定:

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%> 
相關問題