我对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")
感谢您的帮助
莱尼
答案 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()
希望这有帮助!