我正在使用宝石工作流程,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>
任何帮助?
答案 0 :(得分:16)
现在,我已经介绍了没有slug列的友好ID
我不知道你在这里究竟是什么意思,但简单来说,就像试着没有钥匙就开车一样
<强> FriendlyID 强>
FriendlyID的工作方式是使用slug
(或其他标识符)列来创建slugged URL,并根据slugged ID查找:
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
这允许gem基于id
或slug
属性找到
如果您遗漏了slug
列,则会阻止此操作,从而导致您的错误。解决这个问题的方法是:
attr_accessor
如果您想尝试第二个选项,可以试试这个:
#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
这可以在rails中轻松完成:
rails g migration AddSlugToProjects slug
确保在子弹列上添加索引:
class AddSlugToProjects < ActiveRecord::Migration[5.2]
def change
add_column :projects, :slug, :string
add_index :projects, :slug
end
end
现在您要参加比赛了!