【问题标题】:ActiveAdmin Batch Action Dynamic FormActiveAdmin 批量操作动态表单
【发布时间】:2015-09-17 20:44:09
【问题描述】:

我正在使用带有 ActiveAdmin 的 rails 4。我使用自定义表单创建了一个批处理操作,为每个选定的设备创建一个带有内部版本号的任务。这是我的代码的样子:

ActiveAdmin.register Device do

  def get_builds
    builds = []
    Build.all.each do |build|
      builds << [
        "[#{build.resource} - #{build.version}] #{build.file_name}",
        build.id
      ]
    end

    return builds
  end

  batch_action :create_task, form: {
    build: get_builds()
  } do |ids, inputs|

    build = Build.find(inputs[:build])

    Device.where(id: ids).each do |device|
      Task.create({
        device: device,
        build: build
      })
    end

    redirect_to admin_tasks_path
  end

end

我的问题是批处理操作表单中的构建列表没有刷新。当我启动我的应用程序时,它确实有一个所有可用构建的列表,但是如果我添加或删除一个构建, 构建列表不会被刷新。

这当然是因为 form 参数只评估我的函数一次,但我找不到任何关于拥有“动态”表单的文档。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activeadmin


    【解决方案1】:

    ActiveAdmin 在加载时将类缓存在内存中,因此构建只计算一次。要重新计算每个负载,请将lambda 作为form 的值传递,例如:

    form_lambda = lambda do
      builds = Build.all.map do |build|
        ["#{ build.resource } - #{ build.version } #{ build.file_name }", build.id]
      end
    
      { build: builds }
    end
    
    batch_action :create_task, form: form_lambda do
      # ...
    end
    

    【讨论】:

    • 效果很好。我也用 Lambda 尝试过,它也可以工作。你有什么理由选择 Proc 而不是 Lambda?
    • 习惯的力量。 Lambda 实际上是一个更安全的选择,因为它可以很好地处理 return 语句。
    • 更改您的答案以使用 Lambda 并且不接受它。我也认为 Lambda 是一个更安全的选择,它是我在我的应用程序中使用的。
    【解决方案2】:

    @ahmacleod 对每次负载重新计算的方法,通过传递一个 lambda 作为对我有用的表单的值。

    但我不得不面对这个错误

    wrong number of arguments (given 1, expected 0)
    

    解决了这个变化:

    form_lambda = lambda do |id = nil|
      # ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多