友好 id:电影的未定义方法 slug

Posted

技术标签:

【中文标题】友好 id:电影的未定义方法 slug【英文标题】:friendly-id: Undefined method slug for Movie 【发布时间】:2014-10-24 21:18:15 【问题描述】:

我下载了friendly_id gem 以使我的网址更加用户友好。为了遵守他们的指示,我在这里而不是在 GitHub 上提出这个问题。

这是我的展示方法

def show
  @movie = Movie.friendly.find(params[:id])
end

这符合他们的文档

Finders are no longer overridden by default. If you want to do friendly finds, you must
do Model.friendly.find rather than Model.find. You can however restore FriendlyId 
4-style finders by using the :finders addon:

在我的 Model.rb 文件中,我有以下内容

extend FriendlyId
friendly_id :title, use: :slugged

来自他们的文档

friendly_id :foo, use: :slugged # you must do MyClass.friendly.find('bar')

也来自他们的文档

def set_restaurant
  @restaurant = Restaurant.friendly.find(params[:id])
end

作为参考,这里是他们的指南。

当然,我还没有生成迁移,因为我已经创建了表。

我不确定下一步应该做什么?

感谢您的帮助。

【问题讨论】:

可能会有帮助:railscasts.com/episodes/314-pretty-urls-with-friendlyid 正如文档所说,您需要一个 slug 谢谢大家,我去看看视频 【参考方案1】:

您需要运行迁移以将 slug 列添加到您的表中:

class AddSlugToMovies < ActiveRecord::Migration
  def change
    add_column :movies, :slug, :string, unique: true
  end
end

运行 rake db:migrate,然后在您的 Rails 控制台中运行 Move.find_each(&amp;:save) 以填充 slug 列。

【讨论】:

令我感到惊讶的是(据我所知)文档中没有任何地方。 里面有点像:rails generate scaffold user name:string slug:string:uniq【参考方案2】:

Marina 是正确的,您必须添加 slug 字段。

但是很多人感到困惑,因为 FriendlyID 生成了包含 sluggable_id 和 sluggable_type 字段的friendly_id_slugs 表。

create_table "friendly_id_slugs", force: :cascade do |t|
t.string   "slug",                      null: false
t.integer  "sluggable_id",              null: false
t.string   "sluggable_type", limit: 50
t.string   "scope"
t.datetime "created_at"
t.index ["slug", "sluggable_type", "scope"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type_and_scope", unique: true
t.index ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type"
t.index ["sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_id"
t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type"
end

基本上它为历史模块生成friendly_id_slugs 表。 查看他们关于 History__Avoiding_404_s_When_Slugs_Change 的文档:http://norman.github.io/friendly_id/file.Guide.html#History__Avoiding_404_s_When_Slugs_Change

【讨论】:

【参考方案3】:

如果您开始使用新表格,您也可以这样做:

class CreateMovies < ActiveRecord::Migration
  def change
    create_table :movies do |t|
      ...
      t.string :slug
      t.index :slug, unique: true, using: :btree
    end
  end
end

【讨论】:

以上是关于友好 id:电影的未定义方法 slug的主要内容,如果未能解决你的问题,请参考以下文章

Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”

Rails 友好 ID:在 model.new 或 model.import 上未生成 slug

页面控制器中未定义的方法 to_slug

控制器中方法的未定义局部变量或方法“env”

简单的未定义方法错误 - Rails

*可能的未处理承诺拒绝(id:0):类型错误:未定义不是对象(评估'result.cancelled')云图像上传