Результаты экспорта 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 %>

Благодарю комментарий Джея Килина за то, что он направил меня на правильный путь, но я решил опубликовать здесь полный ответ, потому что потратил слишком много времени на то, чтобы подобрать синтаксис, подходящий именно для меня.

Другие вопросы по тегам