繁体   English   中英

我该如何解决这个问题:缺少参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM