Получить url для текущей страницы, но с другим форматом

Использование рельсов 2. Я хочу ссылку на текущую страницу (что бы это ни было), которая сохраняет все параметры одинаковыми, но меняет формат на "csv". (настройка формата может быть выполнена с помощью формата = csv в параметрах или путем установки .csv в конце пути). Например,

posts/1
=> posts/1.csv OR posts/1?format=csv
posts?name=jim 
=> posts.csv?name=jim OR posts?name=jim&format=csv 

Я пробовал это как хакерскую попытку

request.url+"&format=csv"

и это работает отлично, если в текущем URL-адресе есть парамы (пример 2 выше), но прерывается, если нет (случай 1). Я мог бы придумать более хакерские вещи в этих строках, например, проверить, имеет ли запрос параметры, но я думаю, что должен быть более приятный способ.

cheers, max

EDIT - btw, он не гарантирует, что на текущей странице может быть указан именованный маршрут, связанный с ним, в случае, если это необходимо: мы могли бы попасть туда через общий маршрут "/: controller/: action/: id".

Ответы

Ответ 1

<%= link_to "This page in CSV", {:format => :csv } %>
<%= link_to "This page in PDF", {:format => :pdf } %>
<%= link_to "This page in JPEG", {:format => :jpeg } %>

ИЗМЕНИТЬ

Добавить вспомогательный

def current_url(new_params)
  url_for :params => params.merge(new_params)
end

то используйте этот

<%= link_to "This page in CSV", current_url(:format => :csv ) %>

РЕДАКТИРОВАТЬ 2

Или улучши свой хак:

def current_url(new_params)
  params.merge!(new_params)
  string = params.map{ |k,v| "#{k}=#{v}" }.join("&")
  request.uri.split("?")[0] + "?" + string
end

ИЗМЕНИТЬ

ВАЖНО! @floor - ваш подход выше имеет серьезную проблему - он непосредственно изменяет параметры, поэтому, если у вас есть что-то после вызова этого метода, который использует параметры (например, ссылки на ссылки на ссылки), тогда вы получите модифицированную версию, которую вы использовали для создания вашей ссылки. Я изменил его, чтобы вызвать .dup для параметров, а затем изменить дублированный объект, а не изменять параметры напрямую. - @Max Williams

Ответ 2

Вы можете использовать:

link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)

Ответ 3

Ответ на

@floor был отличный, я нашел его очень полезным.

Хотя метод может быть улучшен с помощью метода to_params, а не для его собственного, например:

def current_url(new_params)
  params.merge!(new_params)
  "#{request.uri}#{params.to_params}"
end