2011-10-12 101 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|%> 
相关问题