我有这样的商店控制器:
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>
答案 0 :(得分:0)
该错误告诉您,您正在capitalize
上调用nil
方法。
我在这里看到了2个潜在问题:
find_by_name
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
和""
)。
答案 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
仅此而已。
我希望这会有所帮助