ruby-on-rails 如何解决这个问题:参数丢失?

xdyibdwo  于 2022-12-20  发布在  Ruby
关注(0)|答案(4)|浏览(133)

我使用此函数查找用户,我使用的.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我正在发送有效载荷liket如下:

{name:"ed", age:"12", skin:"black", weight: "180lbs", height:"183"}
6yoyoihd

6yoyoihd1#

Rails的StrongParameters是为一个非常特殊的用途而构建的:
它提供了一个保护属性不被最终用户赋值的接口。这使得动作控制器参数在被显式枚举之前禁止在活动模型批量赋值中使用。
这意味着当您使用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? }
alen0pnh

alen0pnh2#

使用ActionController::Parameters#require的全部意义在于,如果您期望成为散列的参数根本没有被发送,则会导致您的create/update方法提前退出,因为进一步处理请求是没有意义的,这可以防止潜在的未捕获的nil错误。
如果你想允许一个键为空,请使用#fetch

params.fetch(:person, {})
      .permit(:name, :age)

#fetch允许你传递第二个键,这是默认值,它返回一个新的ActionController::Parameters示例。但是看起来你实际上发送的是没有嵌套的平面参数,在这种情况下你也不需要提取:

params.permit(:name, :age)

请注意,Rails默认为JSON请求打开了参数 Package ,这两种方法都很可能有效。

piztneat

piztneat3#

您可以使用Find User
Routes.rb

get "search_user", to: "users#search_user"

控制器/用户_控制器.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

型号/用户.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

=〉这是我以前用过的方法,希望能帮到你。

i2loujxw

i2loujxw4#

如果你想让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参数中传递的任何参数。

相关问题