Ruby on rails 调试RubyonRails错误

Ruby on rails 调试RubyonRails错误,ruby-on-rails,ruby,Ruby On Rails,Ruby,我是RubyonRails的新手,所以我试图调试这个错误,但据我所知,我正在处理prod代码 错误: NoMethodError in JoinController#index undefined method `join_template' for nil:NilClass /app/controllers/join_controller.rb:5:in `index' 好的,索引中的第5行是: elsif current_brand.join_template == 'tms' 所以很明

我是RubyonRails的新手,所以我试图调试这个错误,但据我所知,我正在处理prod代码

错误:

NoMethodError in JoinController#index
undefined method `join_template' for nil:NilClass
/app/controllers/join_controller.rb:5:in `index'
好的,索引中的第5行是:

elsif current_brand.join_template == 'tms'
所以很明显,目前的品牌是零。控制器是AppController的子类,因此检查一下我看到当前的品牌是一种方法:

  def current_brand
    return @current_brand if defined?(@current_brand)
    url_array = request.env['HTTP_HOST'].split('.').reverse
    url = url_array[1] << "." << url_array[0]
    @current_brand = Brand.find(:first, :conditions => ["url LIKE ?", "%" << url << "%"])
  end
def当前品牌
返回@current_brand(如果已定义)(@current_brand)
url_array=request.env['HTTP_HOST'].split('.')。reverse

url=url\u数组[1]可能是您的查询没有返回任何内容。您可以使用调试器,但只需输出@current\u brand并查看它的计算结果就很容易了

logger.debug(@current_brand)

可能是您的查询没有返回任何内容。您可以使用调试器,但只需输出@current\u brand并查看它的计算结果就很容易了

logger.debug(@current_brand)

您必须检查两件事:

  • Rails是否使用该方法最后一行传入的url正确地构建SQL查询
  • 该记录是否存在于品牌表中?你不是真的在检查

  • 此外,这样传入url会使您面临潜在的SQL注入攻击。

    您必须检查两件事:

  • Rails是否使用该方法最后一行传入的url正确地构建SQL查询
  • 该记录是否存在于品牌表中?你不是真的在检查

  • 此外,像这样传入url会使您面临潜在的SQL注入攻击。

    您需要使用rescue重写定义,或者如果/否则,如果您确实得到一个nil元素,那么它不会是一个致命错误

    这就是你的问题:

    @current_brand = Brand.find(:first, :conditions => ["url LIKE ?", "%" << url << "%"])
    

    如果这解决了问题,那么您知道它找不到任何东西,您需要更改代码,如果它返回nil,那么它不提供函数,或者它找到了默认品牌,如我建议的那样。

    您需要使用rescue重写您的定义,或者如果/否则,如果您得到了nil元素,那么它将不会是致命的错误

    这就是你的问题:

    @current_brand = Brand.find(:first, :conditions => ["url LIKE ?", "%" << url << "%"])
    
    如果这解决了问题,那么您知道它找不到任何东西,您需要更改代码,如果它返回nil,那么它不提供函数,或者它找到了默认品牌,如我所建议的