我可以将命名范围附加到Rails中的链接吗?

ste*_*och 3 ruby-on-rails ruby-on-rails-3 has-scope

我有一个事件模型,它有两个命名范围:

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

我通过创建两个新的控制器动作(名为"future"和"past")从我的控制器调用这些范围:

我的控制器:

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
Run Code Online (Sandbox Code Playgroud)

我还有这些额外行动的观点和路线.

这很好用.我的应用程序执行我想要的操作,并且可以链接到我的侧边栏中的新操作,如下所示:

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', future_events_path
%li
  = link_to 'Past Events' past_events_path
Run Code Online (Sandbox Code Playgroud)

现在我对这个设置的问题是,虽然它工作得很好,但我不喜欢我必须为这些额外范围创建新的动作,视图和路由这一事实.我不认为我这样做是正确的.基本上我正在尝试过滤索引页面上的结果,但我必须创建新的操作,路由和视图来执行此操作.这看起来有点麻烦,我想知道是否有另一种方式.

如果我可以取消"未来"和"过去"控制器操作并且只是从视图中调用范围,那将是很好的:

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', events_path.future
%li
  = link_to 'Past Events' events_path.past
Run Code Online (Sandbox Code Playgroud)

显然这不起作用.我已经看到了一个使用自定义select_tag帮助器的示例,但我可以完全修改它以使用没有select标签或JS ...

坚持使用当前的方法是否更好

jor*_*inl 5

您可以只使用索引操作并将范围作为参数传递,因此您可以执行以下操作:

Event.send(params[:scope] : 'all')
Run Code Online (Sandbox Code Playgroud)

范围可以像:

link_to "Future events", events_path(:scope => "future")
Run Code Online (Sandbox Code Playgroud)