Получить 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