控制器中的IF语句不起作用,使用rails

时间:2014-08-06 10:13:21

标签: ruby-on-rails

我真的不明白为什么这个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 谢谢!

4 个答案:

答案 0 :(得分:1)

确实有效。由于您的@resultsnil,而您的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没有结果。