Rails,使用范围过滤表

时间:2014-11-12 13:40:24

标签: ruby-on-rails ruby ruby-on-rails-3

我对rails很新,我必须更新现有项目。我有一个现有的数据库,事先它只是一个用户组,现在应该有多个。现在我想使用旧视图,但在下拉菜单的帮助下进行过滤,但由于某种原因,我无法弄清楚我做错了什么。

以下是我更改的代码片段,因为它预先工作,我认为我的错误必须在这些行中的某个地方。

event.rb

  scope :men, lambda { { :conditions => ["team_id == ?", 1] } }
  scope :women, lambda { { :conditions => ["team_id == ?", 2] } }
  scope :juniors, lambda { { :conditions => ["team_id == ?", 3] } }

events_controller.rb

def index
#   @events = Event.where("startdate >= ?", Date.today).order("startdate, starttime")
#   @events = Event.order("startdate, starttime")

if params[:search]
  @events = Event.search(params[:search])
else
  if params[:filter].nil?
    @events = Event.all
  else
    if params[:filter] == "Alle" then @events = Event.all end
    if params[:filter] == "Men" then @events = Event.men end
    if params[:filter] == "Women" then @events = Event.women end 
    if params[:filter] == "Juniors" then @events = Event.juniors end
  end
end

和index.html.erb

<div class="left">
<%= form_tag events_path, :method => 'get' do %>  
    <%= select_tag "filter", options_for_select([ "Alle", "Men", "Women", "Juniors" ], params[:filter]), {:onchange => 'this.form.submit()'}  %>
<% end %>

可能这是一个简单的错误。我的猜测是,在index.html.erb中,我做错了什么。

作为后续,我想过滤即将发生的事件,因为我可以使用控制器中的注释部分。我可以将其添加到assignmnet中,风格为:

@events = Event.men.where("startdate >= ?", Date.today).order("startdate, starttime")

感谢您的帮助

莱尼

1 个答案:

答案 0 :(得分:3)

您应该将范围更改为新语法:

scope :men, -> { where(team_id: 1) }
scope :women, -> { where(team_id: 2) }
scope :juniors, -> { where(team_id: 3) }

你的控制器逻辑是一个小小的错误和扭曲(检查5次过滤器不是最好的方法,为什么检查例如过滤器是“男人”如果你已经与“Alle”匹配?)。这是一些帮助:

@events = if params[:search].present?
  Event.search(params[:search].to_s)
else
  case params[:filter]
  when "Men" 
    Event.men
  when "Women" 
    Event.women 
  when "Juniors"
    Event.juniors
  else
    Event.all
  end
end

说到视图,你不应该使用内联js,因为它的二十一世纪,以及这种“快速解决方案”以后更难维护,所以:

<div class="left">
<%= form_tag events_path, :method => 'get' do %>  
    <%= select_tag "filter", options_for_select([ "Alle", "Men", "Women", "Juniors" ], params[:filter]), class: 'my_filter' %>
<% end %>

然后添加到events.coffee:

$('select.my_filter').on 'change', ->
  $(this).parents('form').submit()

希望这有帮助!