首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有可能改变Rails路由协议吗?

有可能改变Rails路由协议吗?
EN

Stack Overflow用户
提问于 2014-02-12 03:18:57
回答 3查看 67关注 0票数 1

我想知道是否可以编辑默认的Rails路由约定,根据非ID的字段获取特定的记录?

例如,与其使用谓词/url组合检索特定记录,不如根据ID检索特定记录:

获取/用户/:id

使用动词/url组合检索基于用户名的特定记录:

获取/用户/:用户名

我不明白为什么理论上这会是一个问题,只要用户名必须是唯一的,但我很难理解如何基于Rails路由指南实现它。

我已经收集到,我将需要在我的routes.rb文件中添加一行,以定义单个资源,就在以下内容之前:

代码语言:javascript
复制
resources :users

但是,我很难理解实现这一目标的语法。如能帮助理解这一点,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-12 03:33:27

是的,这是可能的,它们在rails文档中被称为不休息的路线

一个简单的例子是在您的routes.rb中执行以下操作

get ':users/:show/:username', controller: "users", action: "show"

在您的UsersController中,您有一个如下所示的表演动作:

代码语言:javascript
复制
def show  
  if params[:id].present?
    @user = User.find(params[:id])
  elsif params[:username].present?
    @user = User.find_by(username: params[:username])
  end
end

通过这种方式,您可以支持idusername显示,如果您想禁用它们中的任何一个,可以根据需要修改if子句。

票数 0
EN

Stack Overflow用户

发布于 2014-02-12 03:34:14

路由不关心它是ID还是用户名。这确实是你在控制器中找到它的方式。

就在用户显示控制器中:

代码语言:javascript
复制
def show
  @user = User.find_by_username params[:id]
end
票数 0
EN

Stack Overflow用户

发布于 2014-02-12 03:35:24

我认为您希望像这样更改to_param方法:

代码语言:javascript
复制
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,但它非常直观。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21717896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档