友好ID - 未定义方法`slug ='for

时间:2014-01-27 20:53:28

标签: ruby-on-rails friendly-id paper-trail-gem

我正在使用宝石工作流程,Paper Trail和朋友ID。

要使用Paper Trail跟踪状态更改,我已覆盖persist_workflow_state以显式更新工作流列,以便Paper Trail可以捕获更改。

https://github.com/geekq/workflow#integration-with-activerecord

def persist_workflow_state(new_value)
  update_attribute self.class.workflow_column, new_value
end

现在,我已经介绍了没有slug列的Friendly ID,并且在达到上述方法后我得到了错误。

undefined method `slug=' for #<ModelName:0x007f81cf342cd8>

任何帮助?

3 个答案:

答案 0 :(得分:16)

  

现在,我已经介绍了没有slug列的友好ID

我不知道你在这里究竟是什么意思,但简单来说,就像试着没有钥匙就开车一样


<强> FriendlyID

FriendlyID的工作方式是使用slug(或其他标识符)列来创建slugged URL,并根据slugged ID查找:

extend FriendlyId
friendly_id :name, use: [:slugged, :finders]

这允许gem基于idslug属性找到

如果您遗漏了slug列,则会阻止此操作,从而导致您的错误。解决这个问题的方法是:

  1. 使用slug列
  2. 使用attr_accessor
  3. 创建一个slug属性

    如果您想尝试第二个选项,可以试试这个:

    #app/models/ModelName.rb
    attr_accessor :slug
    

答案 1 :(得分:5)

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

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

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

基本上它会为History Module生成friendly_id_slugs表。 查看有关历史_Avoiding_404_s_When_Slugs_Change http://norman.github.io/friendly_id/file.Guide.html#History__Avoiding_404_s_When_Slugs_Change

的文档

答案 2 :(得分:1)

基本要点是,如果您使用的是友好ID宝石,那么您将需要向相关的ActiveModel表添加一个子弹列

示例:向我的项目模型添加一个子弹

每个项目都有一个名称(属性)。

class Project < ApplicationRecord
      extend FriendlyId
      friendly_id :name, use: :slugged        

      validates :name, :state, presence: true
end

1。运行迁移以添加段列

这可以在rails中轻松完成:

 rails g migration AddSlugToProjects slug

2。不要忘记索引!:

确保在子弹列上添加索引:

class AddSlugToProjects < ActiveRecord::Migration[5.2]
  def change
    add_column :projects, :slug, :string
    add_index :projects, :slug
  end
end

现在您要参加比赛了!