-1

我有一个这样的商店控制器:

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 的未定义方法“capitalize”

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

我的store.html.erb有这一行

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

2 回答 2

0

该错误告诉您您正在调用capitalize方法 on nil

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

  1. 使用find_by_name
  2. 如果params[:subcat]nil或是怎么params[:cat]nil

如果没有找到记录,使用find_by_name不会引发异常,nil将返回。

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

您可能需要检查:

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

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

我也会使用blank?而不是empty?(同时检查nil"")。

于 2013-08-11T14:26:21.113 回答
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

对于管理员注册和会话,我使用的是Devise gem

管理员控制器

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参数的回调被注释掉了。所以AdminsControllerpersonal_info attributes不允许这样做。

我只是在其他中取消注释configure_sign_up_params AdminsController中的 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

就这样。

我希望这有帮助

于 2020-08-20T11:55:20.910 回答