How do I create two buttons that generate CSV files with different attributes?
Hello,
I have two questions: 1) I would like to create a button that can generate a CSV file with one set of attributes, and another button that will be able to generate a different set of attributes.
2) Is it possible to add a feature where the CSV file will auto-populate an attribute(or heading) with line-items filled in. For example, when I generate the CSV file I want the sales_tax heading with a code "S" auto-populated in it.
I was able to follow the "Import and Export CSV file" series successfully, but it didn't have this feature I'm looking for.
Thanks in advance.
Steve
#Controller
class UsersController < ApplicationController
def index
@users = User.all
respond_to do |format|
format.html
format.csv { send_data @users.to_csv, filename: "users-#{Date.today}.csv" }
end
end
#Model
class User < ApplicationRecord
def self.to_csv
attributes = %w{id email name price quantity sales_tax total_amount }
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |user|
csv << user.attributes.values_at(*attributes)
end
end
end
views section
<%= link_to 'csv1', users_path(format: "csv") %>
<%= link_to 'csv2', users_path(format: "csv") %>
Regarding question 1: Just add a custom parameter to your paths, like that:
<%= link_to 'csv1', users_path(format: "csv", set: 1) %>
<%= link_to 'csv2', users_path(format: "csv", set: 2) %>
You'll be able to receive this parameter from your controller (like an ordinary parameter: params[:set]
), and use it to decide hov to populate your CSVs.
Alex's suggestion for #1 is exactly the right way to approach that.
For #2, I'm not quite sure I'm following. Are you wanting the sales_tax
header to be just "S" or do you want each of the rows to have "S" as the value for the sales tax column or something else?
I appreciate the response guys. Yes, I would like each row to have an S auto populated.
I'm very new at programming so just bare with me. Would I need to create two def methods with each params[:set]? like this?
def download_csv
respond_to do |format|
format.html
format.csv { send_data Post.all_entries_csv(params[:set2]) }
end
end
Many thanks guys!