Результаты экспорта Ransack в CSV
Я пытаюсь экспортировать список результатов Ransack ( Railscast) в файл CSV ( Railcast). Однако он продолжает экспортировать все объекты, а не результаты, возвращаемые поиском Ransack. Может кто-нибудь сказать мне, где я иду не так?
В контроллере отчетов я попытался передать как @bookings, так и @ search.result:
def index
@search = current_user.bookings.search(params[:q])
@bookings = @search.result
@search.build_condition
respond_to do |format|
format.html
format.csv { render text: Booking.to_csv(@bookings) }\
end
end
А затем метод бронирования to_csv:
def self.to_csv list
CSV.generate do |csv|
csv << column_names
list.each do |booking|
csv << booking.attributes.values_at(*column_names)
end
end
end
Тем не менее, каждый раз, я получаю нефильтрованный список current_user.bookings. Зачем?
3 ответа
Чтобы экспортировать только отфильтрованные результаты в виде csv, вы должны убедиться, что параметры поиска включены в URL, который вы вызываете для создания csv.
Следовательно, если вы хотите экспортировать результаты, которые вы видите на HTML-странице, вы должны позвонить:reports_path(params.merge(format: 'csv')
Попробуй это:
def index
session[:q] = params[:q] if params[:q]
@search = current_user.bookings.search(session[:q])
@bookings = @search.result
@search.build_condition
respond_to do |format|
format.html
format.csv { render text: Booking.to_csv(@bookings) }\
end
end
Ответ Биноя Майкла стоит денег, но его необходимо обновить для сильных параметров, начиная с Rails 5 (2016), как обсуждалось в этом ответе . К сожалению, получить правильный синтаксис немного сложно — если вы просто разрешаете вложенный хэш в свой поисковый запрос, например:
<%= link_to 'Export to CSV with search options',
objects_path(params.permit(q:[:attribute_one_eq, :attribute_two_cont])
.merge({format: :csv})) %>
тогда формат также будет передан как параметр, а не будет изменять фактическую ссылку, что даст:
www.example.com/objects?format=csv&q= ...
Ваш контроллер правильно проанализирует это и вернет правильный формат, но это по-прежнему вызывает проблемы, поскольку браузер пользователя неправильно заполняет расширение файла «.csv» при сохранении файла.
Чтобы получить желаемый формат ссылки, выполните следующие действия:
www.example.com/objects.csv?q= ...
Вам необходимо, как это ни парадоксально, повторно вложить параметры поиска в объект запроса, например:
<% if params[:q] %>
<%= link_to 'Export CSV with search options', objects_path(
{q: params.require(:q).permit(:attribute_one_eq, :attribute_two_cont)}
.merge({format: :csv})) %>
<% else %>
<%= link_to 'Export all to CSV', impairments_path(format: 'csv') %>
<% end %>
Благодарю комментарий Джея Килина за то, что он направил меня на правильный путь, но я решил опубликовать здесь полный ответ, потому что потратил слишком много времени на то, чтобы подобрать синтаксис, подходящий именно для меня.