ActiveAdmin批处理动作动态表单

时间:2015-09-17 20:44:10

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

我正在使用带有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

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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

但是我不得不应对这个错误

wrong number of arguments (given 1, expected 0)

解决此更改:

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