首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ID更改为更友好的ID

将ID更改为更友好的ID
EN

Stack Overflow用户
提问于 2014-09-18 20:31:19
回答 2查看 40关注 0票数 0

创建记录时,为查看该记录而生成的URL以其id结尾

代码语言:javascript
复制
/record/21

我希望能够将其更改为更容易阅读的内容,例如我的姓名和模型中的引用属性。我已经研究过friendly_id,但在实现自定义方法以生成URL时遇到了问题

代码语言:javascript
复制
class Animal < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name_and_ref

  def name_and_ref
   "#{name}-#{reference}"
  end
end

我最终得到了一个错误

代码语言:javascript
复制
PG::UndefinedColumn: ERROR: column animals.name_and_ref does not exist LINE 1: SELECT "animals".* FROM "animals" WHERE "animals"."name_an... ^ : SELECT "animals".* FROM "animals" WHERE "animals"."name_and_ref" = 'Clawd-A123456' ORDER BY "animals"."id" ASC LIMIT 1

def show
  @animal = Animal.friendly.find(params[:id])
end

然后,我遇到了Rails可用的to_param方法,在我的模型中

代码语言:javascript
复制
def to_param
  "#{self.id}-#{self.name}"
end

它将为我生成一个URL

代码语言:javascript
复制
/19-clawd

这是可行的,但是当我执行以下操作时,它会抛出一个错误

代码语言:javascript
复制
def to_param
  "#{self.name}-#{self.reference}"
end

我的问题是,如何才能在不抛出异常的情况下将URL生成为名称和引用

代码语言:javascript
复制
Couldn't find Animal with 'id'=Clawd-A123456
EN

回答 2

Stack Overflow用户

发布于 2014-09-18 21:31:09

如果您希望使用自己的“友好id”,则需要将控制器中的find语句调整为如下所示

代码语言:javascript
复制
id = params[:id].split(/-/, 2).first
@animal = Animal.find(id)

类似地,对于名称/引用组合

代码语言:javascript
复制
name, reference = params[:id].split(/-/, 2)
@animal = Animal.find_by(name: name, reference: reference)

第二种选择稍微困难一些,因为您必须在模型中做一些工作以确保名称/引用对是唯一的。

票数 1
EN

Stack Overflow用户

发布于 2014-09-18 20:58:04

最简单的方法是使用friendly_id,只需添加缺少的数据库列。请记住,您需要确保此新列对于每条记录都是唯一的。它基本上充当主键。

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

https://stackoverflow.com/questions/25912689

复制
相关文章

相似问题

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