Rails. Экспорт модели в Xlsx с параметрами флажка. Link_to, button_to, sumbit_tag?
Мне нужно экспортировать мою модель в.xlsx и предоставить некоторые параметры (флажок) для шаблона axlsx.
У меня есть контроллер "приводит" и пользовательское действие "экспорт", которое должно вызвать мой шаблон export.xlsx.axlsx:
def export
respond_to do |format|
format.xlsx ## here is invoking my export.xlsx.axlsx
end
end
В моем route.rb у меня есть следующее:
resources :leads do
collection { post :ipmort }
end
Я пытаюсь реализовать следующий вид:
<%= form_tag export_leads_path do %>
<%= button_to "Export to Excel", {controller: 'leads', action: "export",
remote: true, form: { "data-type" => "xlsx" }} %>
<% end %>
Но когда я нажимаю эту кнопку, я получаю HTML-формат данных, но не XLSX
Есть ли возможность указать формат response_to в submit_tag, button_to?
Я пытался использовать <% = link_to%>, но не могу получить параметры формы..
<%= form_tag export_leads_path do %>
<%= link_to "Excel", export_leads_path(format: "xlsx", commit: "Excel"), method: :post %>
<% end %>
Здесь у меня нет параметров lead_ids:
Я также пробовал <% submit_tag%>, но результат был таким же, как <% = button_to%>
Пожалуйста, помогите мне, я потратил весь день на борьбу с этой проблемой, и у меня нет мыслей, что я могу сделать еще... Дайте мне знать, если вам нужна дополнительная информация, и я предоставлю ее как можно скорее!
Заранее спасибо!
2 ответа
Я нашел решение, и вот мои советы. Надеюсь, что это может быть полезно для тех, кто столкнулся с той же проблемой.
1) Маршрут:
resources :leads do
collection { post :export }
end
2) Действие контроллера:
def export
case params[:commit]
when "To Excel" then render xlsx: 'export'
when "To CSV" then send_data @leads.to_csv_modified(@lead_ids), filename: 'export.csv'
else render action: "index"
end
end
3) Просмотр:
<%= form_tag export_leads_path, method: :post do %>
<%= text_field_tag :created_at_first %>
<%= text_field_tag :created_at_last%>
<% Lead.new.attributes.keys[0...Lead.new.attributes.keys.length-1].each_with_index do |field, index| %>
<%= check_box_tag "lead_ids[]", field, checked = true %>
<%= field %>
<% end %>
<%= submit_tag 'To Excel', controller: 'leads', action: "export" %>
<%= submit_tag 'To CSV', controller: 'leads', action: "export" %>
<% end %>
4) Шаблон Axlsx (вызывается в контроллере с помощью render xlsx: 'export'):
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
require 'axlsx'
p = Axlsx::Package.new
wb = xlsx_package.workbook
style_shout = wb.styles.add_style sz: 16, b: true, alignment: { horizontal: :center }
wb.add_worksheet(name: "#{Time.now.to_date}") do |sheet|
sheet.add_row params[:lead_ids]
@leads.each_with_index do |lead, index|
sheet.add_row params[:lead_ids].map {|e| lead.send(e) }
end
end
5) Метод to_csv_modified (вызывается в контроллере с помощью send_data @lead.to_csv_modified(@lead_ids), имя файла: 'import.csv'):
def self.to_csv_modified(lead_ids, options = {})
CSV.generate(options) do |csv|
csv << lead_ids
all.each do |lead|
csv << lead.attributes.values_at(*lead_ids)
end
end
end
Если вы хотите посмотреть, как это работает, посетите мой github conditional_exporting_to_XLSX_with_params
Другие полезные ссылки: Axlsx_documentation, Railscast # 396 - импорт csv-and-excel, Railscast # 362 - экспорт csv-and-excel
Используйте формат: "xls"
Также вы можете создать export.xls.erb. Пример таков:
<% @headers = ["Id","Name","Email","Grade","Groups","% Total Playlist Videos Watched"] %>
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Users">
<Table>
<Row>
<% @headers.each do |column| %>
<Cell><Data ss:Type="String"><%=column%></Data></Cell>
<% end %>
</Row>
<% @users.each do |user| %>
<Row>
<Cell><Data ss:Type="Number"><%= user.id %></Data></Cell>
<Cell><Data ss:Type="String"><%= user.name %></Data></Cell>
<Cell><Data ss:Type="String"><%= user.email %></Data></Cell>
<Cell><Data ss:Type="Number"><%= user.grade %></Data></Cell>
<Cell><Data ss:Type="String"><%= user.group_name %></Data></Cell>
<Cell><Data ss:Type="Number"><%= user.videos_seen %></Data></Cell>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
Я надеюсь, что это помогает.