未定义的方法`每个' for nil:erb数组迭代的NilClass

时间:2017-09-26 21:41:35

标签: ruby-on-rails ruby erb

我目前在Rails 5应用程序中工作,您可以在其中搜索名字或姓氏,并显示该帐户的客户记录。但是我从搜索算法中获得了一个Nil对象返回。

customers_controller:

 var b = "¶this¶Is¶¶¶¶Just¶a¶RandomString¶";
 // b.replace(/\u00B6/g,''); or 
 // b.replace(/¶/g,'')
console.log(b);
console.log(b.replace(/\u00B6/g,'')); //  ==> using the unicode of character
console.log(b.replace(/¶/g,'') )

正如您所看到的,如果没有找到记录,则假设返回一个空数组但返回一个Nil对象。

客户/ index.html.erb

class CustomersController < ApplicationController
  def index
    if params[:keywords].present?
      @keywords = params[:keywords]
      customer_search_term = CustomerSearchTerm.new(@keywords)
      @customer = Customer.where(
        customer_search_term.where_clause,
        customer_search_term.where_args).
        order(customer_search_term.order)
    else
      @customers = []
    end
  end
end

2 个答案:

答案 0 :(得分:1)

您应该了解的第一件事是,如果尚未设置实例变量,则返回nil。如果您说@fake_var == nil,那么在此之前您从未定义过@fake_var。您可以将此与常规局部变量进行对比,如果您在定义之前尝试使用它们,则会引发NoMethodError。例如,puts(fake_var)将为fake_var引发NoMethodError。

现在看看你的模板。无论它会绕过@customers。如果尚未设置@customers,您会看到NoMethodError,因为您无法在each上呼叫nil

最后,看看你的控制器动作:

  def index
    if params[:keywords].present?
      @keywords = params[:keywords]
      customer_search_term = CustomerSearchTerm.new(@keywords)
      @customer = Customer.where(
        customer_search_term.where_clause,
        customer_search_term.where_args).
        order(customer_search_term.order)
    else
      @customers = []
    end
  end

特别是params[:keywords].present?时的情况。在这种情况下,您永远不会设置@customers,因此当模板尝试访问它时它将是nil

我认为如果您只是将@customer =替换为@customers =,它就可以解决您的问题。

答案 1 :(得分:0)

你可以强制它使用#to_a返回数组,它将nil转换为空数组

def index
  return [] unless params[:keywords]
  @keywords = params[:keywords]
  customer_search_term = CustomerSearchTerm.new(@keywords)
  @customer = Customer.where(
    customer_search_term.where_clause,
    customer_search_term.where_args).
    order(customer_search_term.order
  ).to_a
end

https://apidock.com/ruby/Array/to_a