我真的不明白为什么这个IF语句不起作用?
class TimetablesController < ApplicationController
def index
if (params[:search_term]).blank?
flash[:error] = "the search field can't be empty"
render 'index'
else
@results = Timetable.find_train_and_next_routes(params[:search_term])
end
#require 'pry'; binding.pry
end
def search
render 'index'
end
end
我得到的错误是这个:
ActionView::Template::Error (undefined method `each' for nil:NilClass):
28: %button.btn(type="submit") Search
29: %br
30: %section.well.well-lg.well-center
31: - @results.each do |train|
32: %ul.items-shell
33: %li
34: = train.train_id
显然@results是空的,如果它是空的,它不会调用方法: find_train_and_next_routes 但是在控制器级别的IF检查工作不正常,想知道为什么?
我的代码 here 谢谢!
答案 0 :(得分:1)
确实有效。由于您的@results
为nil
,而您的index.html.haml
(可能)尝试拨打@results.each
,因此出现错误。要修复它,您可以在索引之前检查是否有@results
:
- if @results.present?
答案 1 :(得分:0)
在这种情况下,@ result不为空,它为空。在控制器的开头放置@result = [],这会将@result初始化为空数组。
我认为你不应该在视图中进行这种检查,控制器会提供结果并确保将所需的结果正确传递给视图。
答案 2 :(得分:0)
问题是,params[:search_term]
param不是空的,
但该搜索词的结果是
Timetable.find_train_and_next_routes(params[:search_term])
是空的,就像搜索不存在的内容一样,您可以通过添加后备选项来修复它,以便each
不会中断,并且它不会需要视图中的条件
@results = Timetable.find_train_and_next_routes(params[:search_term]) || []
答案 3 :(得分:-1)
我觉得你弄错了。你的@results返回零,因为它可能不符合你的条件。
where("departure_time >= ? AND start_location == ?" , "#{arrival_time}", "#{final_location}" )
如果该语句不符合条件,则该语句将返回空数组。当您为空数组调用方法第一个时,它将返回为nil。这就是为什么你对@results没有结果。