将ID更改为更友好的内容

时间:2014-09-18 12:31:19

标签: ruby activerecord ruby-on-rails-4

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

结束
/record/21

我希望能够将其更改为更易于阅读的内容,例如模型中的名称和引用属性。我查看了friendly_id,但无法实现自定义方法来生成URL

class Animal < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name_and_ref

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

我最终收到错误

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方法,在我的模型中我有

def to_param
  "#{self.id}-#{self.name}"
end

将为我生成

的网址
/19-clawd

这样可行,但是当我执行以下操作时会抛出错误

def to_param
  "#{self.name}-#{self.reference}"
end

我的问题是如何在不抛出

的情况下生成名称和引用的URL
Couldn't find Animal with 'id'=Clawd-A123456

2 个答案:

答案 0 :(得分:1)

如果您想使用自己的&#34;友好ID&#34;然后你需要将控制器中的find语句调整为

id = params[:id].split(/-/, 2).first
@animal = Animal.find(id)

同样,对于名称/参考组合

name, reference = params[:id].split(/-/, 2)
@animal = Animal.find_by(name: name, reference: reference)

第二种选择有点困难,因为你必须在模型中做一些工作,以保证名称/参考对是唯一的。

答案 1 :(得分:0)

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