Rails路由到用户名而不是id
我正在尝试将rails users从/ users / 1更改为/ username。 我目前正在设置它,因此它适用于显示和编辑的操作。 实际问题是,当我使用以下命令更新用户时:
它永远不会更新,因为更新操作被路由到/ users /: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
在您的用户模型中:
def to_param username end
默认情况下,ActiveRecord对象上的to_param
方法仅使用对象的ID。 通过将此代码放入模型中,您将覆盖ActiveRecord默认值,因此当您链接到User时,它将使用参数的username
而不是id
。
在User模型中,覆盖to_param
方法以返回要在URL中使用的内容。
class User < ActiveRecord::Base def to_param username end end
在你的控制器而不是使用User.find(params[:id])
你现在需要使用User.find_by_username(params[:id])
您可以使用friendly_id gem: https : //github.com/norman/friendly_id
如果你不想覆盖to_param
,你可以在form标签中指定如下:
<%= form_for @user, :url => user_path(:id => @user.username) do |f|%>