将 FriendlyID slugs 翻译成对应的 ID
Posted
技术标签:
【中文标题】将 FriendlyID slugs 翻译成对应的 ID【英文标题】:Translate FriendlyID slugs to a corresponding ID 【发布时间】:2013-06-08 03:55:06 【问题描述】:我有一个 cmets 脚手架和一个电影脚手架。
用户可以在/movies/the-social-network/cmets/new这个路径下评论电影
我的问题是 cmets 使用 movie_id 工作并与电影链接。
那么我要问的是如何将 the-social-network 作为 movie_id 传递?
PS:我使用的是友好 ID 4
【问题讨论】:
【参考方案1】:首先,由于您想通过像the-social-network
这样的“slug”来查找Movie
,您需要扩展FriendlyId
并告诉它将id
参数化为一个名为slug
的属性。通过传递:slugged
来执行此操作,如下所示:
# app/models/movie.rb
class Movie < ActiveRecord::Base
extend FriendlyId
friendly_id :title, use: :slugged
end
然后,创建一个迁移以存储 slug
的 Movie
对象:
# in console
rails g migration add_slug_to_movies slug:string
修改迁移文件以添加slug
作为索引:
# change migration file
class AddSlugToMovies < ActiveRecord::Migration
def change
add_column :movies, :slug, :string
add_index :movies, :slug
end
end
最后,您需要为数据库中的所有现有电影创建一个 slug。您可以通过逐一保存每部电影来做到这一点:
# in Rails console
Movie.find_each(&:save)
完成此操作后,您应该能够在 Movie
上进行类似于 /movies/the-social-network/comments/new
的查找。
查看this Railscast 了解更多详细信息和示例,包括确保在数据库中更改标题时正确更新对象的 slug。
【讨论】:
【参考方案2】:您可以使用to_param。例如,如果 movie_name
是 'the-social-network',这将起作用:
class Movie < ActiveRecord::Base
def to_param
movie_name
end
end
【讨论】:
以上是关于将 FriendlyID slugs 翻译成对应的 ID的主要内容,如果未能解决你的问题,请参考以下文章
使用 FriendlyID 在 Rails 中独立于标题编辑 slug
Laravel文档阅读笔记-Laravel Str slug() Function Example