Rails Active Admin:如何在仪表板页面上添加CSV上传器操作

Sau*_*ash 2 csv dashboard ruby-on-rails activeadmin sidekiq

我正在一个项目中,我有一个import_listings(file)由Sidekiq perform方法调用的CSV上传器类方法。

class CsvWorker

    include Sidekiq::Worker 
    sidekiq_options retry: false

    def perform(file)
        #call import listings class method on the file.     
        imported = Listing.import_listings(file)
        # return true   
    end
end
Run Code Online (Sandbox Code Playgroud)

我在控制器动作索引中调用perform_async,如下所示:

def import
  @imported = CsvWorker.perform_async(params[:file].path)       
end
Run Code Online (Sandbox Code Playgroud)

一切正常!

我想在后端的活动管理仪表板页面中移动此方法。如下图所示。会有用于不同CSV上传的列,每个列都有一个文件上传表格:

在此处输入图片说明

成员操作将最不适合此任务,因为没有特定的资源。这是一个仪表板页面。

仪表板的代码如下:

ActiveAdmin.register_page "Dashboard" do

  menu priority: 1, label: proc{ I18n.t("active_admin.dashboard") }

  content title: proc{ I18n.t("active_admin.dashboard") } do

    div class: "blank_slate_container", id: "dashboard_default_message" do
      span class: "blank_slate" do
        span "Welcome To Want A Car Buy A Car Backend!"        
        small "Use options below for CSV below:"   
      end
    end
   end # content     
end
Run Code Online (Sandbox Code Playgroud)

问题是,如果我尝试在如下所示的列中添加表单操作,则会给我一个错误,提示我无法在列中添加:

columns do
      column do
        panel "CSV Uploads for Dealers" do
          ul do
             form_tag import_listings_path, multipart: true do
                file_field_tag :file 
                submit_tag "Import Csv" 
            end
          end
        end
      end
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在这些列中添加文件上传表单,该表单将调用sidekiq方法并将文件参数传递给它?在仪表板页面的哪里定义方法?页面上没有控制器吗?我不想将其添加到管理资源文件中。我想要它在仪表板页面上。

Was*_*ain 5

在中ActiveAdmin,当我们要在不绑定任何资源的页面上呈现某些数据时,“ 自定义页面”为您提供了该选项。Dashboard就是这样一个示例,我们将其定义为:ActiveAdmin.register_page 'Dashboard'

自定义页面可为您提供裸机控制器并根据需要进行路由。它还使您也可以呈现任何局部和页面动作。这些页面操作也将具有相应的命名路由,以便路由助手可以访问。您可以从这些动作中调用任何外部模型方法来完成任何任务。

了解了所有这些之后,让我们定义一个页面操作,该操作将接收上载的文件,对其进行处理,然后重定向到仪表板页面。

# app/admin/dashboard.rb

page_action :import_listings, method: :post do
  # set a breakpoint here to check if you receive the file inside params properly
  CsvWorker.perform_async(params[:file].path)
  # do anything else you need and redirect as the last step
  redirect_to admin_dashboard_path
end
Run Code Online (Sandbox Code Playgroud)

此时,:import_listings动作的命名路线为admin_dashboard_import_listings

现在,我们需要在提交表单时参考此操作。让我们将表单块放在部分中:

<!-- app/views/admin/dashboard/_import_listings.html.erb -->

<%= form_tag admin_dashboard_import_listings_path, multipart: true do %>
  <%= file_field_tag 'file', accept: 'text/csv' %>
  <%= submit_tag 'Import Csv' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

最后在内容块中渲染此部分内容:

# app/admin/dashboard.rb

content do
  ...
  columns do
    column do
      panel 'CSV Uploads for Dealers' do
        ul do
          render 'admin/dashboard/import_listings'
        end
      end
    end
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

现在,您将能够在仪表板中呈现该表单,上传文件,提交,在后台作业中处理上传,最后重定向到仪表板或您想要的任何位置。

请享用!