Rails 活跃管理员:如何在仪表板页面上添加 CSV 上传器操作
Rails Active Admin: How to add a CSV uploader action on dashboard page
我正在做一个项目,我有一个 CSV 上传器 class 方法 import_listings(file)
,它被 Sidekiq 执行方法调用。
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
我在控制器操作索引中调用 perform_async,如下所示:
def import
@imported = CsvWorker.perform_async(params[:file].path)
end
一切正常!
我想在后端移动这个方法,在活动的管理仪表板页面中。如下图所示。将有用于不同 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
问题是,如果我尝试在列中添加表单操作,如下所示,它会提示我无法在列中添加:
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
我的问题是:如何在这些列中添加文件上传表单,这将调用 sidekiq 方法并将文件参数传递给它?在仪表板页面的什么地方定义方法?页面上没有控制器吗?我不想将它添加到管理资源文件中。我想要它在仪表板页面上。
在 ActiveAdmin
中,当我们想要在未绑定任何资源的页面上呈现某些数据时,Custom Pages 为您提供了该选项。 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
此时,: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 %>
最后在内容块中渲染这个部分:
# 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
现在您将能够在仪表板中呈现该表单、上传文件、提交、在后台作业中处理上传并最终重定向到仪表板或您想要的任何地方。
尽情享受吧!
我正在做一个项目,我有一个 CSV 上传器 class 方法 import_listings(file)
,它被 Sidekiq 执行方法调用。
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
我在控制器操作索引中调用 perform_async,如下所示:
def import
@imported = CsvWorker.perform_async(params[:file].path)
end
一切正常!
我想在后端移动这个方法,在活动的管理仪表板页面中。如下图所示。将有用于不同 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
问题是,如果我尝试在列中添加表单操作,如下所示,它会提示我无法在列中添加:
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
我的问题是:如何在这些列中添加文件上传表单,这将调用 sidekiq 方法并将文件参数传递给它?在仪表板页面的什么地方定义方法?页面上没有控制器吗?我不想将它添加到管理资源文件中。我想要它在仪表板页面上。
在 ActiveAdmin
中,当我们想要在未绑定任何资源的页面上呈现某些数据时,Custom Pages 为您提供了该选项。 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
此时,: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 %>
最后在内容块中渲染这个部分:
# 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
现在您将能够在仪表板中呈现该表单、上传文件、提交、在后台作业中处理上传并最终重定向到仪表板或您想要的任何地方。
尽情享受吧!