未定义的方法`capitalize'为nil:NilClass

时间:2013-08-11 12:55:48

标签: ruby-on-rails ruby nomethoderror

我有这样的商店控制器:

class StoreController < ApplicationController

  helper_method :product_type

  def store
    cat=params[:cat]
    subcat=params[:subcat]
    if cat.empty?
        @store=SubCategory.find_by_name(params[:subcat]).products.where(product_type: params[:type]).paginate(:page => params[:page], :per_page => 12)
        @subcat=params[:subcat]
        @cat=""
    else
        @store=Category.find_by_name(params[:cat]).products.where(product_type: params[:type]).paginate(:page => params[:page], :per_page => 12)
        @cat=params[:cat]
        @subcat=""
    end
    product_type
  end

  def show
    @show=Product.where(product_type: params[:type]).paginate(:page => params[:page], :per_page => 12)
    product_type
  end

  def product
    @product=Product.find(params[:product_id])
    product_type
  end

  def product_type
    @type=params[:type]
  end

end  

无论如何,我首先调用 show 操作。所以, @type 变量在那里得到它的值。因此, @type 变量在所有方法中都可用,我在所有其他方法中调用了 product_type 方法。

我将所有这些变量称为部分下拉列表,这是一个下拉列表,对整个网站都是通用的,如标题,如下所示: -

<%=link_to "T-shirt", store_path(cat:"",subcat:"tshirts",type: @type) %>  

问题是,我能够在 StoreController 的所有方法中浏览此下拉链接,但产品方法除外。意思是,当我通过商店调用下拉列表中的链接时,显示页面工作正常,但通过产品页面调用时会抛出以下错误。

  

未定义的方法`大写'为nil:NilClass

@type 包含我正在大写的字符串。我哪里做错了?

我的 store.html.erb 有这一行

<h1><%= @type.capitalize+"'s " + @subcat.capitalize + @cat.capitalize %></h1>  

2 个答案:

答案 0 :(得分:0)

该错误告诉您,您正在capitalize上调用nil方法。

我在这里看到了2个潜在问题:

  1. 使用find_by_name
  2. 如果params[:subcat]nilparams[:cat]nil
  3. ,该怎么办?

    如果未找到记录,则使用find_by_name不会引发异常,系统会返回nil

    检查params[:cat]params[:subcat]是否定义的条件不正确。如果缺少某些nil,则可能会出现params值。

    您可能需要查看:

    if params[:cat].blank?
      # ...
    end
    
    if params[:subcat].blank?
      # ...
    end
    

    我还会使用blank?代替empty?(检查nil"")。

答案 1 :(得分:0)

在使用Rails 6应用程序时遇到了类似的问题。

我有2个通过一对一关系连接的模型:

管理模型

class Admin < ApplicationRecord
  has_one :personal_info, dependent: :destroy

  accepts_nested_attributes_for :personal_info, update_only: true, allow_destroy: 
end

个人信息模型

class PersonalInfo < ApplicationRecord
  before_save :personal_info_capitalize

  # This is an enum that can be found in app/models/concerns
  include Gender
  belongs_to :admin, optional: true

  private

  def personal_info_capitalize
    # set the personal info details to capitalize letters
    self.first_name = first_name.capitalize
    self.last_name = last_name.capitalize
  end
end

在Admin Registration和Sessions中,我使用的是 Devise gem

AdminsController

class Admins::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
.
.
.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: 
                                      [personal_info_attributes: [:first_name,
                                      :last_name]])
  end
end

但是,当我尝试创建新的管理员时,它会引发错误:

NoMethodError (undefined method `capitalize' for nil:NilClass):

当我查看日志时,会看到以下内容:

Started POST "/admins" for 127.0.0.1 at 2020-08-20 12:09:19 +0100

Processing by Admins::RegistrationsController#create as HTML

Parameters: {"authenticity_token"=>"+RcJcpyO7mh+DmWOJ0IsymbuIascduIamDI+8RcUxWukL5B+aNAlKlgbqNzanW1EZIJ5WCs3bmV9OI+PLRI43g==", "admin"=>{"personal_info_attributes"=>{"first_name"=>"Promise", "last_name"=>"Chukwuenyem"}, "email"=>"admin@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign Up"}

Unpermitted parameter: :personal_info_attributes

这是我修复的方式

问题在于,将调用sign_up参数的回调已被注释掉。因此, AdminsController 不允许personal_info attributes

我只是取消了AdminsController中的configure_sign_up_params before_action 的注释,以允许那些参数:

class Admins::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
.
.
.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: 
                                      [personal_info_attributes: [:first_name,
                                      :last_name]])
  end
end

仅此而已。

我希望这会有所帮助