Ruby on rails Rails:“除了”vs“slice”去掉某些参数?

Ruby on rails Rails:“除了”vs“slice”去掉某些参数?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试创建一个类实例,其中提取出一个特定的键并保存以备以后使用 考虑这是参数的类型: Parameters: {"p1": "foo", "p2": "bar", "p3":"param that i want to extract" > 我会这样做: @my_class = MyClass.new(whiteList_function.except(:p3)) 或者类似的 @my_class = MyClass.new(whiteList_function) @my_class_

我正在尝试创建一个类实例,其中提取出一个特定的键并保存以备以后使用

考虑这是参数的类型:

Parameters: {"p1": "foo", "p2": "bar", "p3":"param that i want to extract" >
我会这样做:

@my_class = MyClass.new(whiteList_function.except(:p3))
或者类似的

@my_class = MyClass.new(whiteList_function)
@my_class_key = @my_class.slice(:p3)
我的白名单功能:

def whiteList_function
    params.require(:my_class).permit(:p1,:p2,p3)
end
我担心的是,我已经搜索了这么多,有些人提到了使用Exception的安全风险

所以我的问题是,在这个特殊的用法中,取出某些键并在以后使用它们,我应该使用except还是slice?

将except与参数散列一起使用是危险的,因为您的意思是允许除此之外的任何参数,这样会使您的模型面临大规模分配攻击


<> P>除非我不想攻击另一个攻击向量,否则你应该是好的,因为你在你的白名单函数中过滤你的可接受的参数散列。因此,您可以使用slice或except进一步过滤该散列,以最吸引您的为准。

我不是Rails用户,可能我误解了您的问题,但在纯Ruby中,我会这样做

class MyClass
  attr_reader :params
  def initialize params
    @params = whiteList_function params
  end
  def whiteList_function params
    whiteList = [:p1, :p2]
    params.select{|key| whiteList.include? key }
  end
end

MyClass.new({"p1": "foo", "p2": "bar", "p3":"param that i want to extract"})
# #<MyClass:0x00000002802a58 @params={:p1=>"foo", :p2=>"bar"}>

你的两个片段做了不同的事情。例如,在第一个例子中,你对p3什么都不做。在第二个示例中,MyClass.new与其他示例一起接收p3。如果您想取出某个密钥并稍后使用,那么您可能需要从源哈希中删除:该密钥,并在调用MyClass.newsome\h之前将其存储在单独的变量中。除非你想让源散列始终保持不变,否则除非是你的朋友。@Yoshiji先生不执行slice与delete相同的操作?不,slice不会从散列中删除键/值对,delete会:{a:1,b:2}。点击{h.slice:a}.key?:a返回true,但{a:1,b:2}。点击{h}h.delete:a}.key?:a返回false@MrYoshiji谢谢你的意见。我知道我现在想做什么了。我认为OP只想在特定的上下文中省略p3键/值对,但在其他上下文中仍将其保留为白名单以供确认