2015-09-17 3 views
4

Я использую рельсы 4 с ActiveAdmin. Я создал пакетное действие с использованием настраиваемой формы для создания задачи с номером сборки для каждого выбранного устройства. Вот что мой код выглядит следующим образом:ActiveAdmin Batch Action Dynamic Form

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 

Моя проблема заключается в том, что список сборки в бланке периодического действия является не освежает. Когда я запускаю свое приложение, у него есть список всех доступных сборок, но если я добавлю или удалю сборку, список сборки не будет обновлен.

Это, конечно, потому, что параметр формы оценивает мою функцию только один раз, но я не могу найти документацию о наличии «динамической» формы.

ответ

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 
+0

Работает отлично. Я тоже пробовал его с помощью лямбда, и он тоже работает. Любая причина, по которой вы выбираете Proc над лямбдой? – Gab

+1

Сила привычки. Lambda на самом деле является более безопасным выбором, поскольку он корректно обрабатывает утверждения 'return'. – ahmacleod

+0

Измените свой ответ, чтобы использовать Лямбду и плохо принять его. Я тоже считаю, что Lambda - более безопасный выбор, и это то, что я использовал в своем приложении. – Gab