Получить URL для текущей страницы, но в другом формате - PullRequest
16 голосов
/ 06 мая 2011

Использование rails 2. Мне нужна ссылка на текущую страницу (какой бы она ни была), которая сохраняет все параметры одинаковыми, но изменяет формат на «csv».(установка формата может быть сделана с помощью format = 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).Я мог бы придумать более хакерские вещи в этом направлении, например, проверить, есть ли в запросе параметры, но я думаю, что должен быть лучший способ.

ура, макс.

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

Ответы [ 3 ]

24 голосов
/ 06 мая 2011
<%= link_to "This page in CSV", {:format => :csv } %>
<%= link_to "This page in PDF", {:format => :pdf } %>
<%= link_to "This page in JPEG", {:format => :jpeg } %>

EDIT

Добавить помощника

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

EDIT

Внимание! @floor - у вашего подхода выше есть серьезная проблема - он напрямую изменяет параметры, поэтому, если у вас есть что-то после вызова этого метода, который использует параметры (например, ссылки will_paginate), то он получит измененную версию, которую вы использовали построить свою ссылку. Я изменил его, чтобы вызвать .dup для параметров, а затем изменить дублированный объект, а не изменять параметры напрямую. - @ Макс Уильямс

8 голосов
/ 30 января 2015

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

link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)
0 голосов
/ 11 января 2012

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

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

def current_url(new_params)
  params.merge!(new_params)
  "#{request.uri}#{params.to_params}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...