在Rails 4.2上,我想使用Friendly Id来路由到特定的模型,但是不要在模型表上创建一个slug列。我宁愿在模型上使用访问器方法并动态生成slug。这可能吗?我在documentation找不到这个。
答案 0 :(得分:2)
由于使用slug查询数据库(relevant source)的方式,你不能直接使用友好ID来执行此操作。
然而,要完成你想要的并不难。你需要的是两种方法:
Model#slug
方法可以为特定模型提供slug Model.find_by_slug
方法,它将为特定的slug生成相关查询。 现在在您的控制器中,您可以使用Model.find_by_slug
从路径参数中获取相关模型。但是,实现此方法可能会很棘手,尤其是如果Model#slug
使用不可逆的段塞实现(如Slugify),因为它只会在文本中找到无法识别的字符,并将多个事物规范化为相同的字符(例如._和 - 到 - )
您可以使用URI::Escape.encode
和URI::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
。