我目前在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
答案 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