由于旧的多选用户字段插件,无法创建新帐户

不知何故,我的论坛注册对话框中的“创建您的账户”按钮似乎不再起作用了——在填写完所有用户字段(在我看来是正确的)后点击它,没有任何反应(甚至没有错误消息)。

对话框不会关闭,也不会发送电子邮件验证消息。

在注册过程中没有发现用户字段内容有任何明显问题——所有字段都已填写,并且没有显示错误。

在 Chrome 版本 117.0.5938.134(官方构建)和 Edge 版本 118.0.2088.33(官方构建)下进行了测试。

清除浏览器缓存似乎没有效果。

手动“测试电子邮件”功能可以正常向受影响用户的地址发送消息。
现有用户的论坛邮件列表功能运行正常。

我也能正常登录和退出论坛网站。

我不知道最近对论坛设置做了任何更改(除了软件更新),但不确定是否有“忽略用户输入”之类的设置。

我打算注册的用户已经尝试了几次注册,我也从我的端尝试过,并且可以验证此问题。

目前运行的是最新的 Discourse 版本(已更新到 3.2.0.beta2-dev 版本,希望能解决问题)。

我不确定这个问题是什么时候开始发生的,因为我们已经有一段时间没有新用户注册了(也许我现在知道原因了!)

您在浏览器控制台中看到任何错误吗?您的浏览器(或用户)是否安装了任何内容或广告拦截器?

1 个赞

好主意。

是的,在 Edge 浏览器中我看到错误和警告

不确定这是什么意思——这是否意味着多选插件与最新的 Discourse 版本不兼容?

不幸的是,此插件在注册过程中至关重要,用于从下拉列表中填充某些用户字段。

2 个赞

我将尝试暂时禁用该插件以隔离问题。

3 个赞

假设多选插件是导致问题的原因,将旧的“multiselect-dropdown”字段迁移到新的 Discourse“multiselect”字段应该相当直接。Discourse 社区的某个人应该能够帮助您完成这项工作。

2 个赞

[PLUGIN discourse-multiselect-user-field] 未找到 \"model:user-field\" 并修改Class

但是……

编辑 Simon 比我快了一步

2 个赞

您好 - 是的,该插件似乎已被取代,因此不太可能更新 - 但问题在于将插件生成的用户数据迁移到相应的核心用户数据字段,以便可以安全地删除该插件。

简单卸载插件似乎也会删除相关数据(或者至少在查看用户配置文件时不再可见)。

假设我不是唯一的插件用户,如果插件能获得最终更新,包含一个“迁移”功能,那就太好了!

我没有在插件中发现任何会导致通过它创建的用户字段在插件从站点移除时被从数据库中删除的内容。我期望的是,在 Rails 控制台中运行:

UserField.where(field_type: 'multiselect-dropdown')

将返回你在站点上创建的 multiselect-dropdown 字段列表。

每个字段的 id 值可以用来查找站点上每个用户为该字段选择的选项。例如,如果返回的 id 是 [1, 2, 3],将会有对应的 UserCustomField 条目,名称分别为 "user_field_1""user_field_2""user_field_3"。假设这一切都正确,那么这足以让某人从你的站点的 Rails 控制台中迁移旧字段到新字段。

如果插件的作者不处理这个问题,你可能需要雇人来完成这项工作。请注意,我不是在推销工作,我宁愿不做 :slight_smile:

在迁移完成之前,你应该创建新的 Discourse ‘multiselect’ 字段,其选项应与你的旧 multiselect-dropdown 字段的值匹配。为了简化迁移过程,最好为新字段使用与旧字段相同的名称。这样,执行迁移的人就会知道(例如)名为“NZRAB number”的 multiselect-dropdown 字段应该迁移到名为“NZRAB number”的新 ‘multiselect’ 字段。

我同意最好由插件的作者来处理这个问题,但如果不行,那就直接创建新的 ‘multiselect’ 字段并删除插件。

4 个赞

谢谢 Simon

只是想确认一下——Multiselect dropdown 的核心版本是否应该允许用户同时从单个下拉列表中选择多个项目,就像旧插件一样?

当尝试添加一个类型为“Multiselect dropdown”的新用户字段时,只有一个“Multiselect dropdown”选项可供选择(如果插件版本与核心版本不同,我可能会期望有两个)。

现在,如果我选择该 Multiselect dropdown 字段类型,并尝试使用它向用户配置文件添加数据,它只接受单个用户选择,而不是一次选择多个——所以这似乎要么是 multiselect drop down 字段类型的核心版本功能减少了,并且取代了插件字段类型的版本,要么是插件版本存在某种交互,导致我看到的任何版本都瘫痪了?

我认为可以,但我没有尝试过多选插件,所以不确定。Discourse 多选字段的工作方式如下:

用户可以在配置自定义字段时添加的任何项目中进行选择:

用户界面可能与插件所做的不同,但希望结果相同。

您能否确认,在安装了插件的情况下,如果您访问用户个人资料页面,是否可以看到用户为使用该插件创建的字段输入的值?

编辑:@Paul_King,我意识到我对迁移数据可能过于乐观了。如果不访问您站点的 Rails 控制台,了解情况的最简单方法是运行 Data Explorer 查询,查看旧字段是如何保存的。如果您的站点上没有安装该插件,可能值得添加它。

如果您的站点上安装了 Data Explorer 插件,请尝试运行以下查询:

SELECT * FROM user_fields

希望该查询能返回一些 field_type 设置为“multiselect-dropdown”的结果。如果返回了,迁移数据应该相当直接。

2 个赞

谢谢 Simon

您展示的多选下拉列表操作示例与我以前的工作方式相符,这在恢复原始功能方面似乎很有希望。

目前,旧插件和新版本核心功能似乎都无法正常工作——整个字段在用户配置文件编辑屏幕上根本不显示了,尽管用户使用旧插件最初输入的值会显示给点击另一个用户头像的用户,但原始数据在两侧显示方括号和引号。

是的,该查询确实返回了该字段类型。旧插件名称和 Discourse 核心名称因各自的多选用户字段类型而相同,这是否可能导致混淆?

这并不奇怪。这意味着迁移所需的数据已在数据库中,但很可能其格式不像我希望的那样便于迁移。

为确认这一点,请尝试运行以下数据浏览器查询:

SELECT * FROM user_custom_fields
WHERE name = 'user_field_1'
ORDER BY user_id

该查询结果中有用的信息将是 value 列中设置的内容。理想情况下,结果应类似于此,每个用户选择的选项都有一个单独的条目:

我怀疑您会发现,用户选择的每个选项的值将存在于同一行中。例如,[this, that]\"[this, that]\"。如果正确,您能否发布一些值条目?

可能需要一些反复试验才能弄清楚如何将值解析为 Discourse 期望的格式。

2 个赞

我猜导出用户文件将提供所有需要的数据,并且可以使用类似以下内容进行清理,以便导入:

2 个赞

这似乎会奏效。可能需要雇佣 Jay 或类似的人来完成这项工作。

从 Rails 控制台进行更改在技术上也是可行的。该方法的难度将取决于旧的“multiselect-dropdown”UserCustomFields 的 value 字段是如何设置的。如果每行存储一个选项,那么从旧的 UserCustomField 条目生成新的 UserCustomField 条目将是直接的。如果每行存储多个选项,那可能会有点棘手。

2 个赞

他很幸运我正好就在附近 :wink:

数据格式很有趣——它有两种不同的形式,有一天改变了。它们最初是这样的:

this
that

有一天,它们突然变成了:

this,that

我做了一些糟糕的电子表格魔法来将数据转换为新的多选字段(如上所示)。不幸的是,脚本(还)无法处理多选。有人愿意提交一个拉取请求吗?

虽然我可以变通/破解它来完成工作,但我认为:

第一遍:所有具有单个条目的用户使用现有脚本
第二遍:所有具有多个条目的用户使用一个破解的脚本,强制创建新行。

稍后……
我的狡猾计划奏效了。

这是第二遍的破解脚本:

# frozen_string_literal: true

require "csv"
desc "Import user fields"
task "multi_user_fields:import_csv", [:filename] => [:environment] do |_task, args|

  puts "Filename: #{args[:filename]}"
  data = CSV.read(args[:filename], headers: true );

  data.each_entry do |row|
    puts "doing row."
    row.to_h.each do |x|
      user_id = row['user_id']
      if x.first == 'user_id'
        u = User.find(user_id)
        puts "Got user: #{u.username}"
      else
        name = x.first
        val = row[x.first]
        ucf = UserCustomField.find_by(user_id: row['user_id'], name: name)
          if val
            puts "Creating UCF: #{row['user_id']} Name: #{name}, value: #{val}"
            UserCustomField.create(user_id: user_id, name: name, value: val)
          end
      end
    end
  end
end

@pfaffman - 更新实际脚本以处理多选字段对于将来修改 UCF 的其他人来说有多容易?

4 个赞

从我这边来看,我很高兴地报告 Nathan 和他的流程(包括所有技巧)确实奏效了。

我已确认注册对话框现在可以正常工作,意向用户可以再次从下拉选项中选择多个答案,并且作为已批准用户可以再次查看和编辑这些答案,旧的多选插件也已成功移除。

感谢 @nathank@omarfilip@simon@RGJ 花时间考虑这个问题并分享你们的知识和见解——这再次证明了这个社区有多么棒!

5 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.