将 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

然后,创建一个迁移以存储 slugMovie 对象:

# 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 slug 中隐藏资源名称

使用 FriendlyID 在 Rails 中独立于标题编辑 slug

在模块中使用 FriendlyId

Laravel文档阅读笔记-Laravel Str slug() Function Example

Laravel文档阅读笔记-Laravel Str slug() Function Example

FriendlyID 历史记录不适用于 Rails 中更新的模型 url