我是否可以在Rails模型上使用Friendly Id而无需在模型表上创建slug列?

时间:2017-01-15 05:56:01

标签: ruby-on-rails friendly-id

在Rails 4.2上,我想使用Friendly Id来路由到特定的模型,但是不要在模型表上创建一个slug列。我宁愿在模型上使用访问器方法并动态生成slug。这可能吗?我在documentation找不到这个。

2 个答案:

答案 0 :(得分:2)

由于使用slug查询数据库(relevant source)的方式,你不能直接使用友好ID来执行此操作。

然而,要完成你想要的并不难。你需要的是两种方法:

  1. Model#slug方法可以为特定模型提供slug
  2. Model.find_by_slug方法,它将为特定的slug生成相关查询。
  3. 现在在您的控制器中,您可以使用Model.find_by_slug从路径参数中获取相关模型。但是,实现此方法可能会很棘手,尤其是如果Model#slug使用不可逆的段塞实现(如Slugify),因为它只会在文本中找到无法识别的字符,并将多个事物规范化为相同的字符(例如._和 - 到 - )

    您可以使用URI::Escape.encodeURI::Escape.decode,但最终会出现一些丑陋的slu ..

答案 1 :(得分:0)

正如所讨论的here我采用以下方法进行基于动态slug的自定义路由。

我想要这样的自定义路线:/foos/the-title-parameterized-1(其中“1”是id对象的Foo

Foo型号:

#...
attr_accessor :slug
#dynamically generate a slug, the Rails `parameterize` 
#handles transforming of ugly url characters such as 
#unicode or spaces:
def slug
  "#{self.title.parameterize[0..200]}-#{self.id}"
end
def to_param
  slug
end 
#...

routes.rb

get 'foos/:slug' => 'foos#show', :as => 'foo'

foos_controller.rb

def show
  @foo = Foo.find params[:slug].split("-").last.to_i
end 

在我的show视图中,我可以使用默认的网址辅助方法foo_path