2010-11-17 58 views
6

当我觉得必须有一种比我最终得到的更好的方式时,我正面临着与Rails合作的那些时刻之一。如何在Ruby on Rails中通过请求保留查询字符串值?

我有四个查询字符串参数,我希望通过一个rails应用程序的各个部分保存请求 - 不同的控制器和操作,一些通过javascript呈现 - 以便用户最终在具有相同查询字符串参数的URL开始。

我发现很难相信最好的方式是通过隐藏的表单字段,并手动添加参数作为redirect_to的一部分,或者使用每个会话变量 - 它似乎不像轨道一样。

有谁知道更好的方法来管理这个?

谢谢!

+0

为什么不把它们放在会话中?你可以多谈一些他们的用途,为什么把他们放在会议或数据库中不适合你? – PreciousBodilyFluids 2010-11-17 04:54:33

+0

没有那么多,它不起作用,只是令我惊讶的是,这不是一些Rails的优点,这使得不需要。至于我在做什么的细节,我保存在jQuery覆盖(由rails视图呈现)中的表单中的项目,并保存后,我希望用户查看基于相同参数的页面就像他们离开时一样。这些参数用于日期和应用程序特定的视图配置。 – evanmcd 2010-11-17 04:57:06

回答

5

在这种情况下,我会经常使用一个辅助函数来创建基于当前参数集的url。换句话说,我想定义这个:

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

然后用它与url_for为您的窗体和链接创建网址。如果您需要修改和则params的,只是将它们传递到合并:

# 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')) 

这会保留现有PARAMS加任何覆盖您在合并

2

如果你想始终保持一定的参数进行的跨每一个生成的URL,你都可以在你的应用中实现一个default_url_parameters方法。

这是记录不完整,但mentioned in the Rails 18n Guide

在application_controller.rb实现:

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

现在,通过Rails的生成的每个URL将包括当前请求的值foobar(除非网址是正在生成,指定那些具体是别的东西)。

+0

这不会工作..在代码=应该是=>中的错误,但它仍然无法正常工作..即使在使用rails命名路径时,我有一个jquery功能,可以在少数页面上工作,但不是全部。 – whizcreed 2015-04-13 06:02:58

-1

请注意,这不是一个铁轨解决方案,但在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需要在页面加载时被调用。

相关问题