Rails Admin — загрузите CSV для создания экземпляров модели

У меня есть прямая модель в моем приложении Ruby on Rails, которая также доступна в моем экземпляре rails_admin. Пользователям rails_admin нужно будет заходить ежедневно и загружать файл CSV или XLS, и на основе некоторой логики, которую я буду отображать на серверной части, будут создаваться экземпляры модели на основе данных, находящихся в CSV/XLS. Мне не нужно сохранять CSV или XLS в файловой системе, так что проблема не в этом. Проблема в том, что я не совсем уверен, как получить интерфейс в rails_admin, где пользователь может загрузить CSV/XLS, нажать «Загрузить», а серверная часть должна позаботиться обо всем остальном.

Есть ли у rails_admin поддержка для этого? Могу ли я через него создать интерфейс, куда я могу загружать файлы для обработки одной из моих моделей?


person randombits    schedule 29.10.2013    source источник
comment
Какой драгоценный камень вы используете для загрузки? и что именно вы хотите. вы хотите загрузить файл в серверной части или обработать данные csv/xls в фоновом режиме.   -  person Sabyasachi Ghosh    schedule 01.11.2013
comment
Я просто хочу загрузить файл и обработать его в фоновом режиме. Что-то столь же простое, как отправка файла POST, а затем я могу запустить асинхронное задание. Я не обязательно управляю моделью или экземплярами класса с помощью этого файла непосредственно из администратора рельсов. Мне просто нужен способ, чтобы люди могли загрузить его туда.   -  person randombits    schedule 03.11.2013
comment
много способов вы можете сделать это. лучший способ - просто загрузить файл с помощью скрепки или жемчужины несущей волны. тогда у ruby ​​есть своя библиотека csv для его обработки. и используйте всякий раз, когда гем или просто создайте поток, чтобы обработать его в фоновом режиме.   -  person Sabyasachi Ghosh    schedule 03.11.2013
comment
Я понимаю. Чего я не понимаю, так это того, как интегрировать этот пользовательский интерфейс в rails_admin.   -  person randombits    schedule 03.11.2013
comment
Я не уверен, что у администратора рельсов есть эта возможность. но если он не поддерживает это, создайте свой собственный метод и просмотрите его.   -  person Sabyasachi Ghosh    schedule 03.11.2013
comment
Я думаю, что плагин, указанный ниже freemanoid, — это то, что мне нужно, просто проверяю, работает ли он — rails_admin_import   -  person randombits    schedule 03.11.2013


Ответы (3)


Похоже, вам, возможно, придется создать собственное действие и представление. Один из способов сделать это — использовать этот подключаемый модуль настраиваемых действий. Здесь также есть руководство по созданию пользовательского действия. . Я также использовал SmarterCSV, и он отлично работает.

Чтобы зарегистрировать пользовательское действие в Rails Admin, вы должны сделать это в config/initializers/rails_admin.rb:

module RailsAdmin
  module Config
    module Actions
      class YourClass < RailsAdmin::Config::Actions::Base
        RailsAdmin::Config::Actions.register(self)

         ##code here, as explained more below

      end
    end
  end
end

В этом классе вы можете наследовать любое из базовых действий. Итак, чтобы зарегистрировать пользовательский частичный файл, в этом классе вы должны сделать:

    # View partial name (called in default :controller block)
    register_instance_option :template_name do
      :your_class
    end

Частичные части вашего _your_class должны находиться в app/views/rails_admin/main/, вы можете обрабатывать форму с помощью multipart. Я не включаю частичный код, если вы хотите, чтобы я попробовал его, дайте мне знать.

Вероятно, вы также захотите выполнить действие над областью действия модели:

    register_instance_option :collection? do
      true
    end

И введите код вашего контроллера. Вероятно, было бы лучше всего обрабатывать обработку здесь, например:

register_instance_option :controller do
      Proc.new do

        @order = Order.import(params[:file])
        f = SmarterCSV.process(file.tempfile)
              f.each do |r|

               #combine date and time fields 
               r[:date_time] = [r[:date],r[:time]].join(' ')

                Order.create("date" => r[:date_time])
        end
      end
    end

Затем ваше действие должно быть зарегистрировано в RailsAdmin::Config::Actions следующим образом (этот код был помещен в config/initializers/rails_admin.rb):

module RailsAdmin
  module Config
    module Actions
      class ApproveReview < RailsAdmin::Config::Actions::Base
        RailsAdmin::Config::Actions.register(self)
      end
    end
  end
end

Затем пользовательское действие должно быть указано в конфигурации действий в config/initializers/rails_admin.rb:

RailsAdmin.config do |config|
  config.actions do
    dashboard
    index
    new

    your_class

    show
    edit
    delete
  end
end

В учебнике есть больше деталей, но я думаю, что это должно быть довольно солидным началом!

person Jordan Davis    schedule 07.11.2013

Вы можете создать пользовательское действие в RailsAdmin, которое будет отвечать за получение загруженного файла и его обработку.

Итак, в вашем файле app/admin/your_model.rb вы можете добавить что-то вроде:

  member_action :upload_csv, :method => :post do
    # param[:file] will contain your uploaded file
    # So add your logic here to open/parse the file
    # Take a look at this link: http://railscasts.com/episodes/396-importing-csv-and-excel
  end

И, на ваш взгляд, просто добавьте форму с опцией multipart

<%= form_tag import_products_path, multipart: true do %>
  <%= file_field_tag :file %>
  <%= submit_tag "Import" %>
<% end %>
person Arkan    schedule 06.11.2013
comment
Вы говорите об ActiveAdmin, но вопрос к RailsAdmin. - person kuboon; 27.02.2014

Посмотрите на это, и вы увидите, что вы можете вызывать то, что хотите, из обратного вызова.

Также вы можете создать пользовательское действие для обработки вашего CSV.

Или вы можете использовать существующий плагин для импорта CSV.

person freemanoid    schedule 31.10.2013