我想知道是否可以编辑默认的Rails路由约定,根据非ID的字段获取特定的记录?
例如,与其使用谓词/url组合检索特定记录,不如根据ID检索特定记录:
获取/用户/:id
使用动词/url组合检索基于用户名的特定记录:
获取/用户/:用户名
我不明白为什么理论上这会是一个问题,只要用户名必须是唯一的,但我很难理解如何基于Rails路由指南实现它。
我已经收集到,我将需要在我的routes.rb文件中添加一行,以定义单个资源,就在以下内容之前:
resources :users但是,我很难理解实现这一目标的语法。如能帮助理解这一点,将不胜感激。
发布于 2014-02-12 03:33:27
是的,这是可能的,它们在rails文档中被称为不休息的路线。
一个简单的例子是在您的routes.rb中执行以下操作
get ':users/:show/:username', controller: "users", action: "show"
在您的UsersController中,您有一个如下所示的表演动作:
def show
if params[:id].present?
@user = User.find(params[:id])
elsif params[:username].present?
@user = User.find_by(username: params[:username])
end
end通过这种方式,您可以支持id和username显示,如果您想禁用它们中的任何一个,可以根据需要修改if子句。
发布于 2014-02-12 03:34:14
路由不关心它是ID还是用户名。这确实是你在控制器中找到它的方式。
就在用户显示控制器中:
def show
@user = User.find_by_username params[:id]
end发布于 2014-02-12 03:35:24
我认为您希望像这样更改to_param方法:
class User < ActiveRecord::Base
def to_param
"#{id} #{name}".parameterize
end
end这将使url为: /user/id-name。如果您想在名称之前去掉id,它会变得更复杂一些。如果您只是要删除它,它很可能会中断,因为ActiveRecord首先需要id来查找。
为了解决这个问题,我建议使用FriendlyId gem:id
还有一个RailsCast展示了如何使用Friendly_id,但它非常直观。
https://stackoverflow.com/questions/21717896
复制相似问题