【问题标题】:How can I preserve querystring values across requests in Ruby on Rails?如何在 Ruby on Rails 中跨请求保留查询字符串值?
【发布时间】:2010-11-17 04:34:17
【问题描述】:

当我觉得一定有比我最终得到的更好的方法时,我遇到了使用 Rails 工作的那些时刻。

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

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

有谁知道更好的管理方法吗?

谢谢!

【问题讨论】:

  • 为什么不把它们放在会话中呢?你能多谈谈它们的用途吗?为什么将它们放在会话或数据库中对你不起作用?
  • 这并不是说它不起作用,只是让我感到惊讶的是,不是一些 Rails 的优点使得它变得不需要。至于我正在做什么的细节,我正在从 jQuery 覆盖中的表单中保存一个项目(由 rails 视图呈现),保存后我希望用户根据相同的参数查看页面就像他们离开时一样。这些参数用于日期和应用特定的视图配置。

标签: ruby-on-rails query-string


【解决方案1】:

在这种情况下,我会经常使用辅助函数来根据当前的参数集创建 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'))

这将保留现有参数以及您合并的任何覆盖。

【讨论】:

    【解决方案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 的当前请求值(除非正在生成的 url 将它们专门指定为其他内容)。

    【讨论】:

    • 这行不通.. 代码中有一个错误 = 应该是 => 并且仍然无法正常工作.. 即使在使用名为路径的 rails 时,我也有一个 jquery 功能,可以在几页上使用但不是全部。
    【解决方案3】:

    请注意,这不是 Rails 解决方案,但在 80% 的情况下对我有用。这就是我能够使用 jQuery 实现这一点的方式,显然不是最好的方法。而且我无法使其超过第二级链接:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多