【问题标题】:Rails: Specifing params without value to link_toRails:指定对link_to没有价值的参数
【发布时间】:2010-12-21 10:09:21
【问题描述】:

假设路线

map.resources :articles

你是怎么得到这个的

/articles?most_popular

使用link_to 方法?

尝试了以下方法:

link_to articles_path(:most_popular) # exception
link_to articles_path(:most_popular => nil) # /articles
link_to articles_path(:most_popular => true) # /articles?most_popular=true

注意:我正在使用 inherited_resourceshas_scope

【问题讨论】:

    标签: ruby-on-rails activeresource link-to-function


    【解决方案1】:

    如果您不向参数添加值,您将不遵守 W3C 标准,该标准要求 params 部分的格式为 field=value

    我建议您改为向您的文章控制器添加一个新的 :most_popular 操作。

    在你的 routes.rb 上:

    map.resources :articles, :collection => {:most_popular=>:get}
    

    在您的控制器上:

    class ArticlesController < ApplicationController
    ...
    def most_popular
      @articles = ...
    end
    

    关于你的看法:

    link_to most_popular_articles_path() # /articles/most_popular
    

    这将与 HTML 兼容,您的网址看起来几乎相同(将一个 ? 更改为一个 /)并且您的控制器将被简化(您将拥有 most_popular 操作与索引分开)。

    问候!

    更新 (2017):W3C 标准似乎不再强制使用 field=value 语法(或不再强制使用它)。然而,一些服务器被记录为“阻塞”不符合此语法的查询。详情请见Is a url query parameter valid if it has no value?

    【讨论】:

    • 我的代码完全像这样。然而,我最近开始重构我的代码,并想知道 RESTFUL 和/或如何重新使用这种方法。不是“最受欢迎的”,而是索引的辅助过滤器,而是查询选项 (filter=most_popular)
    • Restful 并不意味着仅限 CRUD。这意味着每个 url 都可以作为资源。问题是:最受欢迎的文章是否与常规文章有足够的差异,值得拥有自己的资源?答案不是“我必须有 CRUD”。它是“这取决于应用程序”。如果它们不是很重要,添加一个过滤器参数就足够了。如果他们非常重要,他们可能应该拥有自己的控制器。我的解决方案是中间的。
    • 是的,这很有见地。谢谢gorn
    • @kikito 你能用指向“W3C 标准”的链接来支持这个断言吗?
    • @mb21 你可能没有注意到我在 2009 年 - 七年前回答了这个问题。那时我可能在某个地方搜索过它。我应该把链接放在那里,我很抱歉。恐怕我现在不能再花时间在谷歌上搜索它了。但如果你确实找到了,请在评论中包含它。
    【解决方案2】:

    最后一个例子:

    link_to articles_path(:most_popular => true) # /articles?most_popular=true
    

    是正确的方法。否则,您可以手动构建链接:

    <a href="<%= articles_path %>?most_popular">articles</a>
    

    【讨论】:

      【解决方案3】:

      https://stackoverflow.com/a/4557763/803804

      规范没有强制要求?key=value 格式,实际上?key 就可以了。

      此外,Rails(和大多数框架)会处理它。

      在 Rails 的情况下,它会将其转换为看起来像 { 'key' =&gt; nil } 的参数

      不幸的是,将一个值为 nil 的参数传递给 rails url helpers 将导致该参数不被添加到查询字符串中,所以我发现这样做的唯一方法是articles_path + "?most_popular"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多