Rails使用friendly_id gem报错:BlogPost类不存在`friendly_id'方法
博客站点出现
undefined method 'friendly_id' for BlogPost:Class错误排查 已查阅Stack Overflow及YouTube视频,仍无法定位博客站点出现以下错误的原因:
undefined method `friendly_id' for BlogPost:Class
期望生成的URL格式为:www.mysite.com/blog-title-here
blog_post.rb 模型代码
class BlogPost < ApplicationRecord # 确保表单中博客标题和内容不为空 has_rich_text :content validates :title, presence: true validates :content, presence: true attribute :published_at, :datetime extend friendly_id :title, use: :slugged def next BlogPost.where('id > ?', id).first end def prev BlogPost.where('id < ?', id).last end def should_generate_new_friendly_id? title_changed? || slug.blank? end end
blog_post_controller.rb 控制器代码
class BlogPostsController < ApplicationController before_action :authenticate_user!, except: [:index, :show] before_action :set_blog_post, only: [:show, :edit, :update, :destroy] def index @blog_posts = BlogPost.all @blog_posts = BlogPost.order(created_at: :desc) end def show @next_blog_post = @blog_post.next @prev_blog_post = @blog_post.prev end def new @blog_post = BlogPost.new end def create @blog_post = BlogPost.new(blog_post_params) if @blog_post.save # 重定向到新创建博客的详情页 redirect_to @blog_post else # 否则重新渲染新建模板 render :new, status: :unprocessable_entity end end def edit end def update if @blog_post.update(blog_post_params) redirect_to @blog_post else render :edit, status: :unprocessable_entity end end def destroy @blog_post.destroy redirect_to root_path end private def blog_post_params params.require(:blog_post).permit(:title, :content, :published_at) end def set_blog_post @blog_post = BlogPost.friendly.find(params[:id]) rescue ActiveRecord::RecordNotFound redirect_to root_path end def authenticate_user! redirect_to new_user_session_path, alert: 'Please sign in to continue.' unless user_signed_in? end end
数据库schema片段
create_table "blog_posts", force: :cascade do |t| t.string "title" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.datetime "published_at" t.string "slug" t.index ["slug"], name: "index_blog_posts_on_slug" end 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_type", "sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_type_and_sluggable_id" end
怀疑是否因使用title而非name作为BlogPost标题字段导致错误,已尝试重启服务器、执行rails db:migrate、更新schema,但均无效。
内容的提问来源于stack exchange,提问作者AntMar
相关产品推荐
相关产品推荐

