You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:07:03