关于外键崩溃的RailsAdmin验证

时间:2019-07-12 15:28:15

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

  

无法替换票证,因为一个或多个新记录可能   不保存。

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

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

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

我正在使用Rails 4.2.0和RailsAdmin 1.1.1

为Guilermo编辑:

  

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

无论是使用简单的默认值创建此代码的人,以下是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崩溃。

1 个答案:

答案 0 :(得分:0)

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

您可以这样做:

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]