Могу ли я прикрепить именованную область к ссылке в Rails? - PullRequest
3 голосов
/ 08 сентября 2010

У меня есть модель событий, которая имеет две названные области:

class Event < ActiveRecord::Base
  scope :future, lambda { where('events.date >= ?', Time.zone.now) }
  scope :past, lambda { where('events.date <= ?', Time.zone.now) }
end

Я вызываю эти области из моего контроллера, создавая два новых действия контроллера (называемых «будущее» и «прошлое»):

Мой контроллер:

class EventsController < InheritedResources::Base
  actions :index, :show, :future, :past

  has_scope :future
  has_scope :past

  def future
    index! { @events = Event.future }
  end

  def past
    index! { @events = Event.past }
  end
end

У меня также есть представления и маршруты для этих дополнительных действий.

Это отлично работает. Мое приложение выполняет то, что я хочу, и я могу ссылаться на новые действия на боковой панели следующим образом:

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', future_events_path
%li
  = link_to 'Past Events' past_events_path

Теперь моя проблема с этой настройкой заключается в том, что, хотя она работает просто отлично, мне не нравится тот факт, что мне нужно создавать новые действия, представления и маршруты для этих дополнительных областей. Я не думаю, что я делаю это правильно. По сути, я пытаюсь отфильтровать результаты на странице индекса, но для этого мне нужно создать новые действия, маршруты и представления. Это кажется немного громоздким, и мне интересно, есть ли другой путь.

Было бы неплохо, если бы я мог покончить с «будущим» и «прошлым» действиями контроллера и просто вызвать области видимости из вида следующим образом:

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', events_path.future
%li
  = link_to 'Past Events' events_path.past

Очевидно, что это не работает. Я видел пример , который использует собственный помощник select_tag, но я вполне могу изменить его для работы без тега выбора или JS ...

лучше придерживаться текущего метода

Ответы [ 2 ]

5 голосов
/ 08 сентября 2010

Вы можете иметь только действие index и передать область видимости в качестве параметра, поэтому вы должны сделать:

Event.send(params[:scope] : 'all')

Объем может быть передан как:

link_to "Future events", events_path(:scope => "future")
4 голосов
/ 26 января 2013

Использование send на основе внешнего параметра немного опасно.Я рекомендую has_scope gem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...