Ruby on rails 自定义轨道布线的正确方法

Ruby on rails 自定义轨道布线的正确方法,ruby-on-rails,routes,Ruby On Rails,Routes,在我的路由中,我目前拥有资源:用户,因此我获得了诸如/users/id/和/users/id/edit等路由……但是,我希望我的页面的“默认”URL以/name开头,其中name是用户的唯一登录名 所以,现在我的路由文件看起来像这样 resources :users match '/:name' => 'users#show_by_name' 然后在我的users\u controller.rb文件中,我定义了这样的方法 def show_by_name @user = User.

在我的路由中,我目前拥有
资源:用户
,因此我获得了诸如
/users/id/
/users/id/edit
等路由……但是,我希望我的页面的“默认”URL以
/name
开头,其中
name
是用户的唯一登录名

所以,现在我的路由文件看起来像这样

resources :users

match '/:name' => 'users#show_by_name'
然后在我的users\u controller.rb文件中,我定义了这样的方法

def show_by_name
  @user = User.find_by_name(params[:name])
  render 'show'
end
因此,基本上它与
defshow
做的事情相同,但它不是在URL中传递
id
,而是一个名称

在我看来,我是这样联系的

<li><%= link_to "My Profile", "/#{current_user.name}" %></li>
  • 与使用
  • 我想知道我是否用正确的方法来做这件事。我觉得在我的用户\控制器中使用额外的方法是在做一些不必要的事情

    我是否最好删除
    资源:用户
    行,创建更适合我的应用程序上所需URL类型的路由


    谢谢您的时间。

    您最好在用户模型中重写to_param方法。Rails内置了搜索友好URL的功能

     class User < ActiveRecord::Base
         def to_param
            "#{user.name}"
         end
       end
    

    我建议您使用FriendlyID,它是一个整洁的gem,可以将:id转换为基于表的一列的值。在您的案例中,这可能是一个标题,例如名称

    我发现开始使用它相当容易

    Ryan Bates在这段视频中谈到了这一点:


    对于安装,请看这里:

    Andrew和Martin都是对的(FriendlyID gem实际上使用了to_param override方法),但是您要问两个问题:

    • 我可以使用另一个属性而不是默认id作为路由中的id吗
    • 我可以使用非资源性路线吗
    在这两种情况下,答案都是肯定的。您可以覆盖
    to_param
    方法,并使用非静止路由,例如:

    match '/:id' => 'users#show'
    

    也可以跳过URL中的
    /users/
    吗?确定您可以使用前面提到的类似Jef的路由,然后重定向到用户控制器中的显示操作:match'/:id'=>“users#show”URL生成得很好,但是我的控制器中出现了一个错误,例如,
    找不到id=andrew的用户
    。我是否需要更改我的控制器
    @user=user.find(params[:id])
    ?您的控制器中仍然应该有@user=user.find(params[:id])。您是否在用户中重写了to_param方法?是的。我刚才在看to_param方法上的一个铁路司机。似乎使用.find会将传递的参数转换为整数?因此,如果我没有使用像
    {id}{name}
    这样的东西,那么它就找不到id。将我所有的User.find更改为User.find,现在就可以按名称查找了。非常有趣!它的工作原理似乎与to_param类似。与to_param override一起完美工作。谢谢
    match '/:id' => 'users#show'