自定义Rails路由的正确方法

时间:2012-03-23 00:02:13

标签: ruby-on-rails routes

在我的路线中,我目前有resources :users,因此我获得了/users/id//users/id/edit等路线,但是,我想要'默认'我的网页的网址以/name开头,其中name是用户的唯一登录名。

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

resources :users

match '/:name' => 'users#show_by_name'

然后在我的users_controller.rb文件中,我将方法定义为......

def show_by_name
  @user = User.find_by_name(params[:name])
  render 'show'
end

所以,基本上它与def show做同样的事情,但不是在URL中传递id,而是名称。

在我看来,我这样连接......

<li><%= link_to "My Profile", "/#{current_user.name}" %></li>

与使用<li><%= link_to "My Profile", current_user %></li>

相反

我想知道我是否正确地采用这种方式。通过在users_controller中使用额外的方法,我觉得我正在做一些不必要的事情。

我最好只删除resources :users行并创建更适合我的应用程序所需URL类型的路径吗?

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

您最好在用户模型中覆盖to_param方法。 Rails具有搜索友好URL的内置功能

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

Url将生成为

user_url(@user)
#http://0.0.0.0:3000/users/andrew

# Controller
@user = User.find_by_name(params[:id])

答案 1 :(得分:1)

我建议您使用FriendlyID,它是一个整洁的宝石,它将:id转换为基于表格列之一的值。例如,这可能是您的标题或名称的标题。

我发现开始使用起来相当容易。

Ryan Bates在这次截屏视频中谈到了这一点:http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

有关安装的信息,请点击此处:https://github.com/norman/friendly_id

答案 2 :(得分:1)

Andrew和Martin都是对的(FriendlyID gem实际上使用了to_param覆盖方法),但你提出了两个问题:

  • 我可以使用其他属性而不是默认ID作为路由中的ID吗?
  • 我可以使用非资源丰富的路线吗?

在这两种情况下,答案都是肯定的。您可以覆盖to_param方法并使用非REST路由,例如:

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