未初始化的常量Post :: FriendlyID

时间:2018-04-04 21:57:33

标签: ruby-on-rails friendly-id

更新

在撰写此问题时找到了解决方案。仍然发布问题以防其他人有同样的问题。我的解决方案是因为拼写错误。请参阅本文的底部和已发布的答案以获取完整代码。

原始问题

尝试在RoR webapp中实现friendlyId gem。

我已经在GitHub forum上提出了这个问题,但是在维基说明中看到我在这里发布我的问题。我确实已经搜索了一个答案并尝试了多个建议,但没有任何效果。这就是我做的。

STEPS

工作~~>已将gem 'friendly_id', '~> 5.1.0'添加到我的Gemfile并运行bundle install 工作~~>跑rails g friendly_id

$ rails g friendly_id
  create  db/migrate/20180404164213_create_friendly_id_slugs.rb
  create  config/initializers/friendly_id.rb

修复了迁移文件~~&gt;已将class AddSlugToPosts < ActiveRecord::Migration更改为class AddSlugToPosts < ActiveRecord::Migration[5.1]

工作~~&gt;跑rake db:migrate

$ rake db:migrate
== 20180404164213 CreateFriendlyIdSlugs: migrating ============================
-- create_table(:friendly_id_slugs)
   -> 0.0246s
-- add_index(:friendly_id_slugs, :sluggable_id)
   -> 0.0048s
-- add_index(:friendly_id_slugs, [:slug, :sluggable_type])
   -> 0.0035s
-- add_index(:friendly_id_slugs, [:slug, :sluggable_type, :scope], {:unique=>true})
   -> 0.0031s
-- add_index(:friendly_id_slugs, :sluggable_type)
   -> 0.0029s
== 20180404164213 CreateFriendlyIdSlugs: migrated (0.0392s) ===================

工作~~&gt;运行rails g migration add_slug_to_posts slug:string:uniq然后运行rake db:migrate

$ rails g migration add_slug_to_posts slug:string:uniq
      invoke  active_record
      create    db/migrate/20180404164731_add_slug_to_posts.rb
$ rake db:migrate
== 20180404164731 AddSlugToPosts: migrating ===================================
-- add_column(:posts, :slug, :string)
   -> 0.0078s
-- add_index(:posts, :slug, {:unique=>true})
   -> 0.0042s
== 20180404164731 AddSlugToPosts: migrated (0.0123s) ==========================

更新了posts_controller.rb ~~&gt; 从:

def set_post
   @post = Post.find(params[:id])
end

致:

def set_post
   @post = Post.friendly.find(params[:id])
end

更新了post.rb ~~&gt; 来自:

class Post < ApplicationRecord
  belongs_to :member

  Status = ['Draft', 'Under Review', 'Edits Needed', 'Completed']

  validates_with FeaturedValidator
end

致:

class Post < ApplicationRecord
  extend FriendlyID
  friendly_id :title, use: :slugged

  belongs_to :member

  Status = ['Draft', 'Under Review', 'Edits Needed', 'Completed']

  validates_with FeaturedValidator
end

错误~~&gt;运行rails c打开控制台以更新以前的帖子以获得slug。跑了Post.find_each(&:save)并得到了这个错误。

2.5.0 :001 > Post.find_each(&:save)
Traceback (most recent call last):
        3: from (irb):1
        2: from app/models/post.rb:1:in `<top (required)>'
        1: from app/models/post.rb:8:in `<class:Post>'
NameError (uninitialized constant Post::FriendlyID)

研究并退出控制台并尝试spring stop,结果表明spring没有运行。然后,我尝试了以下操作,并在每次尝试Post.find_each(&:save)

之前重新启动控制台

我尝试将extend FriendlyID更改为extend ::FriendlyID

错误NameError (uninitialized constant FriendlyID)

我尝试在开头添加require "friendly_id"

错误NameError (uninitialized constant Post::FriendlyID)

我一起试过。

错误NameError (uninitialized constant FriendlyID)

然后我在某处看到require: "friendly_id"应该在Gemfile中,而不是模型。所以,我在那里将其删除并将其添加到Gemfile中,如下所示:gem 'friendly_id', '~> 5.1.0', require: "friendly_id"

错误NameError (uninitialized constant Post::FriendlyID)

非常感谢任何想法。

解决方案

当我写这篇文章并查看我的代码时,我意识到我的错误是由于一个错字。我输入extend FriendlyID而不是extend FriendlyId。注意最后的'd'假设是小写的,而不是大写的。我将使用我的最终代码发布一个答案,该代码适用于遇到此问题的任何其他人。

1 个答案:

答案 0 :(得分:1)

正如我在问题的最后提到的那样。我的问题是,当我打电话在我的模型中扩展'FriendlyId'时,我有一个错字。我把最后的'd'大写了。这是我的最终代码。

的Gemfile

# Friendly URLs
gem 'friendly_id', '~> 5.1.0', require: "friendly_id"

应用程序/模型/ post.rb

class Post < ApplicationRecord
  extend FriendlyId
  friendly_id :title, use: :slugged

  belongs_to :member

  Status = ['Draft', 'Under Review', 'Edits Needed', 'Completed']

  validates_with FeaturedValidator
end

app / controllers / post_controller.rb ~~将def set_post更改为

def set_post
  @post = Post.friendly.find(params[:id])
end