2009-11-29 3 views
2

Предположив маршрутRails: Params без задав значение для LINK_TO

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_resources с has_scope

ответ

3

Если вы не добавить значение параметров не будет уважая 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-совместимый, ваши адреса будут выглядеть практически одно и то же (изменение одного на единицу /), и ваш контроллер будет упрощен (у вас будет самое_популярное действие отдельно d из индекса).

С уважением!

Update (2017): Похоже, что стандарт W3C не предписывает синтаксис field=value (или не санкционировать его больше). Однако некоторые серверы документируются, чтобы «задушить» запросы, не соответствующие этому синтаксису. См. Is a url query parameter valid if it has no value?.

+0

Я делаю код именно так. Однако в последнее время я начал реорганизовывать свой код и задаюсь вопросом, как RESTFUL и/или recoomoended ему этот подход. Разве это не «самый популярный», а скорее фильтр для индекса, поэтому опция запроса (filter = most_popular) – gorn

+1

Restful не означает CRUD-only. Это означает, что каждый URL-адрес может быть ресурсом. Вопрос в том, являются ли самые популярные статьи достаточно разными от обычных статей, чтобы заслужить свой собственный ресурс? Ответ не в том, «у меня должен быть CRUD». Это «это зависит от приложения». Если они не очень важны, добавление параметра фильтра будет достаточно. Если бы они были очень важны, они, вероятно, заслуживали бы своего собственного контролера. Мое решение является промежуточным. – kikito

+0

Да, это очень проницательно. Спасибо gorn – gorn

1

Последний пример: у вас есть

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

правильный способ. В противном случае вы можете просто построить ссылку вручную:

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

 Смежные вопросы

  • Нет связанных вопросов^_^