在我的路线中,我目前有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类型的路径吗?
感谢您的时间。
答案 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覆盖方法),但你提出了两个问题:
在这两种情况下,答案都是肯定的。您可以覆盖to_param
方法并使用非REST路由,例如:
match '/:id' => 'users#show'