Rails路由到用户名而不是id

jwh*_*ing 20 ruby ruby-on-rails

我正在尝试将rails users从/ users/1更改为/ username.我目前正在设置它,因此它适用于显示和编辑的操作.实际问题是当我使用以下命令更新用户时:

<%= form_for @user do |f|%>
Run Code Online (Sandbox Code Playgroud)

它永远不会更新,因为更新操作被路由到/ 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
Run Code Online (Sandbox Code Playgroud)

编辑:

卫生署!这解决了这个问题:

match '/:id', :to => "users#show", :as => :user, :via => :get
Run Code Online (Sandbox Code Playgroud)

bri*_*ker 34

在您的用户模型中:

def to_param
  username
end
Run Code Online (Sandbox Code Playgroud)

to_param默认情况下,ActiveRecord对象上的方法仅使用对象的ID.通过将此代码放入模型中,您将覆盖ActiveRecord默认值,因此当您链接到User时,它将使用usernamefor参数而不是id.


ctc*_*rry 19

在用户模型中覆盖该to_param方法以返回您要在URL中使用的内容.

class User < ActiveRecord::Base
  def to_param
    username
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • 在路由文件中指定`param::username`会更好吗?因为参数不再应该被称为`:id`,而是应该被称为`:username`。 (2认同)

Aru*_*nan 5

您可以使用friendly_id gem:https://github.com/norman/friendly_id