【问题标题】:RailsAdmin validations on foreign key crashesRailsAdmin 验证外键崩溃
【发布时间】:2019-07-12 15:28:15
【问题描述】:

更换工单失败,因为一条或多条新记录可能 不会被保存。

我的表单模型有_many 个票。如果票证设置了特定标志,则票证不能有表格。当我通过尝试将票分配给现有表单来进行测试时,它崩溃,而不是注意我的验证。

自从它的 RailsAdmin 以来,我看到它只是在执行检查 Form 对象是否保存的错误处理之前调用 update_attribute(显然保存了嵌套对象)。

是否有任何已知的方法可以让 RailAdmin 优雅地捕获此验证异常足够长的时间,以便对表单本身失败的验证进行正常的错误处理?这都是自动处理任意对象的编辑/新建的一部分。

我正在使用 Rails 4.2.0 和 RailsAdmin 1.1.1

为 Guilermo 编辑:

我在 rails admin 上有模型无法保存,因为嵌套对象无效。您是否在 rails admin 上使用嵌套表单字段?你能在表单模型和验证上显示 rails admin 配置代码吗?我很乐意为此提供帮助。

创建此代码的人使用了简单的默认内容,以下是 RailsAdmin 配置初始化程序中的相关行。

edit do
  include_all_fields
end

观察到的行为是标准 RailsAdmin 字段,您可以在其中搜索对象,或从下拉列表中选择,然后选择其中一个或多个附加到当前对象。

嵌套对象无效(因此父对象也是如此)。问题在于,系统没有将父对象返回为无效,而是因为嵌套对象无效而崩溃。

RailsAdmin 代码似乎调用了 update_attribute(这会引发未捕获的错误),然后实际执行保存! (连同崩溃检查)。我基于以下代码:

https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/edit.rb

具体来说:

@object.set_attributes(params[@abstract_model.param_key])
          @authorization_adapter && @authorization_adapter.attributes_for(:update, @abstract_model).each do |name, value|
            @object.send("#{name}=", value)
          end
          changes = @object.changes
          if @object.save
            @auditing_adapter && @auditing_adapter.update_object(@object, @abstract_model, _current_user, changes)
            respond_to do |format|
              format.html { redirect_to_on_success }
              format.js { render json: {id: @object.id.to_s, label: @model_config.with(object: @object).object_label} }
            end
          else
            handle_save_error :edit
          end

它在@object.set_attributes 处崩溃。

【问题讨论】:

  • 我在 rails admin 上有模型无法保存,因为嵌套对象无效。您是否在 rails admin 上使用嵌套表单字段?你能在表单模型和验证上显示 rails admin 配置代码吗?我很乐意为此提供帮助。
  • 嵌套表单域?显然不是,在我之前的人只是使用了默认的东西:我将编辑我的问题以澄清。

标签: ruby-on-rails validation rails-admin


【解决方案1】:

您可以通过不在模型编辑表单上显示没有该标志的工单来避免此问题。

你可以这样做:

edit do
  field :tickets do
    associated_collection_scope do
      proc { |scope| scope.where(flag: false) }
    end
  end
end

不幸的是,这意味着您必须指定将显示哪些字段并且您将无法使用

include_all_fields

您可以使用 include_fields 方法获得更好的语法来做到这一点

include_fields [:tickets, :other_field, :etc]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多