Rails: Specifing params without value to link_to
Supposing the route
map.resources :articles
how do you get this
/articles?most_popular
using link_to
method?
tried the following:
link_to articl开发者_如何学编程es_path(:most_popular) # exception
link_to articles_path(:most_popular => nil) # /articles
link_to articles_path(:most_popular => true) # /articles?most_popular=true
note: i'm using inherited_resources with has_scope
If you don't add a value to the parameters you will not be respecting the W3C standard, which mandates that the params section has the form field=value
.
I recommend that you add a new :most_popular action to your articles controller instead.
On your routes.rb:
map.resources :articles, :collection => {:most_popular=>:get}
On your controller:
class ArticlesController < ApplicationController
...
def most_popular
@articles = ...
end
On your views:
link_to most_popular_articles_path() # /articles/most_popular
This will be HTML-compliant, your urls will look practically the same (changing one ? by one /) and your controller will be simplified (you will have the most_popular action separated from the index).
Regards!
Update (2017): It appears that the W3C standard doesn't mandate the field=value
syntax (or doesn't mandate it any more). However some servers are documented to "choke" on queries not complying with this syntax. See Is a url query parameter valid if it has no value? for details.
The last example you have:
link_to articles_path(:most_popular => true) # /articles?most_popular=true
Is the correct way. Otherwise you could just construct the link by hand:
<a href="<%= articles_path %>?most_popular">articles</a>
See https://stackoverflow.com/a/4557763/803804
The spec doesn't mandate the ?key=value
format and in fact ?key
is just fine.
In addition Rails (and most frameworks) will handle it.
In the case of Rails it will convert this into params that look like { 'key' => nil }
Unfortunately passing a param into the rails url helpers with a value of nil will result in that param not being added to the querystring so the only way I've found to do that is articles_path + "?most_popular"
精彩评论