Как я могу сохранить значения строки запроса в запросах в Ruby on Rails? - PullRequest
7 голосов
/ 17 ноября 2010

Я сталкиваюсь с одним из тех моментов, когда я работаю с Rails, когда я чувствую, что должен быть лучший способ, чем тот, с которым я в конечном итоге сталкиваюсь.Сохранять запросы через различные части приложения rails - различные контроллеры и действия, некоторые из которых отображаются с помощью javascript, - чтобы пользователь в конечном итоге получил URL-адрес с теми же параметрами строки запроса, с которых он начинал.Трудно поверить, что лучший способ - через скрытые поля формы и ручное добавление параметров обратно как часть redirect_to или использование сессионных переменных для каждого - это просто кажется, что-то вроде.

Кто-нибудьзнаете лучший способ справиться с этим?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 18 ноября 2010

В подобных случаях я часто использую вспомогательную функцию для создания URL-адресов на основе текущего набора параметров. Другими словами, я бы определил это:

def merge_params(p={})
  params.merge(p).delete_if{|k,v| v.blank?}
end

А затем используйте его с url_for для создания URL-адресов для ваших форм и ссылок. Если вам нужно изменить и параметры, просто передайте их в объединение:

# url for the current page
url_for(merge_params)

# url for a different action
url_for(merge_params(:controller => 'bar', :action => 'bar'))

# et cetera
url_for(merge_params(:action => 'pasta', :sauce => 'secret'))

Это сохранит существующие параметры плюс любые переопределения, в которые вы сливаетесь.

3 голосов
/ 10 июля 2014

Если вы хотите всегда сохранять определенные параметры для каждого сгенерированного URL-адреса, вы можете реализовать метод default_url_parameters в своем приложении.

Это плохо документировано, но упоминается в Руководстве по Rails 18n

Реализация в вашем application_controller.rb:

def default_url_options(*args)
  super.merge(
     :foo = params[:foo],
     :bar = params[:bar]
  )
end

Теперь каждый URL сгенерированRails будет включать значения текущего запроса для foo и bar (если не генерируется URL-адрес, который указывает те, которые должны быть другими).

0 голосов
/ 13 апреля 2015

Обратите внимание, что это не решение для рельсов, но оно работает для меня в 80% случаев. Вот как я могу добиться этого с помощью jQuery, очевидно, не самый лучший подход. И я не могу заставить его работать после 2-го уровня ссылок:

function mergeGPS(){
  var lat = getParam('lat');//localStorage.getItem('lat');
  var lng = getParam('lng');//localStorage.getItem('lng');
  if(lat == null || lng == null){return false;}
    var links = jQuery("a");
    jQuery.each(links, function(y, lnk){
      //debugger;
     var uri = jQuery(lnk).attr('href') + "?lat="+lat+"&lng="+lng;
     jQuery(lnk).attr('href',uri); 
     //debugger;
    })
}

function getParam(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

mergeGPS должен вызываться при загрузке страницы.

...