将FriendlyID slugs转换为相应的ID

时间:2013-06-12 06:08:21

标签: ruby-on-rails associations slug friendly-id

我有一个评论脚手架和电影脚手架。

用户可以在此路径评论电影/ movies / the-social-network / comments / new

我的问题是评论使用movie_id工作并与电影联系。

所以我要问的是如何将社交网络作为movie_id传递?

PS:我正在使用Friendly Id 4

2 个答案:

答案 0 :(得分:1)

首先,由于您希望通过像Movie这样的“slug”查找the-social-network,因此您需要扩展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。

答案 1 :(得分:0)

您可以使用to_param。例如,如果movie_name是“社交网络”,则可以使用:

class Movie < ActiveRecord::Base
  def to_param
    movie_name
  end
end