[英]How can i solve this: params is missing?
我正在使用此功能来查找我正在使用的用户.require
仅在我发送两个或至少一个参数时有效,但如果我发送空参数,我会收到错误,发送参数不应该是强制性的
def find_params
params.require(:person).permit(:name, :age)
end
如果我发送姓名或年龄我会工作,但如果我什么都不发送我会收到此错误
params is missing
如果我像这样发送空的:
{}
或null
它应该可以正常工作返回所有用户
或者我不应该用它来搜索用户吗?
params.require(:person).permit(:name, :age)
我可能必须这样使用吗?
params[:name] and params[:age]
我正在使用 reactjs 我正在发送这样的有效负载:
{name:"ed", age:"12", skin:"black", weight: "180lbs", height:"183"}
Rails 的StrongParameters
是为一个非常特殊的用途而构建的:
它提供了一个接口,用于保护属性不受最终用户分配的影响。 这使得 Action Controller 参数在被显式枚举之前禁止用于活动模型质量分配。
这意味着当您使用params
只是从数据库中读取时,就没有必要(也几乎没有任何优势)使用StrongParameters
。
相反,我会像这样直接在控制器中使用params
:
def index
@users = User
.filter_by(:name, params.dig(:person, :name))
.filter_by(:age, params.dig(:person, :age))
# ...
end
为了完成这项工作,您需要在app/models/user.rb
中定义一个filter_by
范围:
scope :filter_by, -> (attr, value) { where(attr => value) if value.present? }
使用ActionController::Parameters#require
的全部意义在于,如果您希望成为散列的参数根本没有发送,那么您的创建/更新方法将提前退出,因为进一步处理请求没有意义,这会阻止潜在的未捕获的零错误。
如果要允许键为空,请改用#fetch
:
params.fetch(:person, {})
.permit(:name, :age)
#fetch
允许您传递第二个键,这是默认值,它返回一个新的 ActionController::Parameters 实例。 但看起来您实际上是在发送未嵌套的平面参数,在这种情况下您也不需要获取:
params.permit(:name, :age)
请注意,默认情况下,Rails 会为 JSON 请求启用参数包装,并且两者都很有可能会起作用。
您可以使用Find User
路线.rb
get "search_user", to: "users#search_user"
控制器/users_controller.rb
def search_user
@users = User.search(params[:name], params[:age], params[:skin], params[:weight], params[:height]) // search name or age
// you can use byebug to check @users
end
模型/user.rb
def self.search(name, age, skin, weight, height)
if name.blank? & age.blank? & skin.blank? & weight.blank? & hight.blank?
all
else
where('name LIKE ? OR age LIKE ? OR skin LIKE ? OR weight LIKE ? OR height LIKE ?', "%#{name}%", "%#{age}%", "%#{skin}%", "%#{weight}%", "%#{height}%")
end
end
=> 这是我使用的方式。 希望能帮到你。
如果要允许find_params
函数处理空参数或缺少参数,可以将其修改为直接在 params 对象上使用 permit 方法,而不是使用 require 方法。 这将允许您处理 :person 参数缺失或为空的情况。
以下是如何修改find_params
函数以处理空参数或缺失参数的示例:
def find_params
params.permit(:name, :age)
end
通过此修改,函数仍将返回 :name 和 :age 参数(如果它们存在),但如果它们缺失则不会引发错误。 如果你想允许所有参数,你可以使用:person
参数而不是指定单个参数:
def find_params
params.require(:person).permit!
end
这将允许该函数接受在:person
参数中传递的任何参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.