Rails 友好 ID:在 model.new 或 model.import 上未生成 slug

Posted

技术标签:

【中文标题】Rails 友好 ID:在 model.new 或 model.import 上未生成 slug【英文标题】:Rails Friendly ID: slug is not generated on model.new or model.import 【发布时间】:2017-03-10 11:31:49 【问题描述】:

您好,我正在使用friendly_id gem,

class Student < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged

这里 Student.create 根据需要生成一个 slug 作为名称。

但就我而言,我正在使用“新”方法创建学生数组并使用 active-record-import 保存到数据库

student_names.uniq.each do |s|
  students << Student.new(name: s)
end

Student.import students, on_duplicate_key_update: 
    conflict_target: [:name],
    timestamps: true

在“新”上,它不会创建 slug,也不会在导入时创建。

如何在导入时生成 slug? 提前致谢

【问题讨论】:

【参考方案1】:

FriendlyId 使用 before_validation 回调来生成和设置 slug (doc),但 activerecord-import 不会调用 ActiveRecord 回调 ...(wiki)。

所以,您需要手动调用before_validation 回调:

students.each do |student|
  # Note: if you do not pass the ` false ` block, `after_callback` will be called and slug will be cleared.
  student.run_callbacks(:validation)  false 
end
Student.import ...

【讨论】:

以上是关于Rails 友好 ID:在 model.new 或 model.import 上未生成 slug的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中验证日期?

Rails friendly_id 不会在 heroku 上的现有用户上呈现

如何在 Rails 3 中用户定义友好的 URL?

Rails - 如何将生成的 URL 修复为友好的 URL

如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?

识别 Rails 中对 iframe 不友好的站点——即使标题中缺少 x-frame-options