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

Geo*_*ath 9 ruby-on-rails friendly-id paper-trail-gem

我正在使用宝石Workflow,Paper Trail和Friend 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
Run Code Online (Sandbox Code Playgroud)

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

undefined method `slug=' for #<ModelName:0x007f81cf342cd8>
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Ric*_*eck 16

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

我不知道你在这里究竟是什么意思,但简单地说,这就像是在没有钥匙的情况下开车


FriendlyID

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

extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
Run Code Online (Sandbox Code Playgroud)

这允许gem根据idslug属性进行查找

如果您错过了slug列,这将阻止此操作,从而导致您的错误.解决这个问题的方法是:

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

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

#app/models/ModelName.rb
attr_accessor :slug
Run Code Online (Sandbox Code Playgroud)


小智 5

理查德佩克是正确的,你必须添加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
Run Code Online (Sandbox Code Playgroud)

基本上它会为History Module生成friendly_id_slugs表.看看他们关于History__Avoiding_404_s_When_Slugs_Change的文档:http://norman.github.io/friendly_id/file.Guide.html#History__Avoiding_404_s_When_Slugs_Change