【问题标题】:How to get just GET and POST params as hash in Rails?如何在 Rails 中获取 GET 和 POST 参数作为哈希?
【发布时间】:2017-10-31 13:42:32
【问题描述】:

我想在 Rails 中获得任何额外的 GETPOST params,而不需要 Rails 自己的添加,例如 controllerformat 等...

params.inspect 给了我想要的东西,但它有一些 Rails 为我添加的键,例如 controllerformat。我只想将用户输入 GETPOST 参数作为哈希。我怎样才能做到这一点?我找不到任何东西。

网址:

http:/test.com/some/path?query1=1&query2=1

运行:

puts params.inspect

预期:

{"query1"=>"1", "query2"=>"1"}

实际:

{"query1"=>"1", "query2"=>"1", "format"=>":json", "controller"=>"get", "action"=>"index", "folder"=>"some/path"}

这也可以与 POST 请求结合使用。我只想过滤它们,只将它们作为散列获取。

我从控制器内部执行此操作。使用 Rails 5。

【问题讨论】:

  • 你从哪里执行这个?您使用的是什么版本的导轨。
  • @engineersmnky,我从控制器内部执行此操作。使用 Rails 5。

标签: ruby-on-rails ruby hash


【解决方案1】:

您应该有允许的参数 (Strong parameters)。

在你的控制器中有允许的 params 方法。

def your_params
  params.permit(:query1, :query2)
end

如果你想对那些你可以做的事情进行哈希处理

your_params.to_h #This will return hash of permitted params

更新:

如果您有多个query* 类型的参数,您可以select 它们和permit!。这里是命令行解释

# passing the list of parameters
> params = ActionController::Parameters.new({query1: 'aa', query2: 'bb', query3: 'cc', controller: 'users', action: 'index'})
=> <ActionController::Parameters {"query1"=>"aa", "query2"=>"bb", "query3"=>"cc", "controller"=>"users", "action"=>"index"} permitted: false>

# Select all the parameters of type query<integer>
> all_queries = params.select {|i| i.match?(/query\d/) }
=> <ActionController::Parameters {"query1"=>"aa", "query2"=>"bb", "query3"=>"cc"} permitted: false>

 # mark the selected as permitted
> all_queries.permit!
=> <ActionController::Parameters {"query1"=>"aa", "query2"=>"bb", "query3"=>"cc"} permitted: true>

# get them as hash
> all_queries.to_h
=> {"query1"=>"aa", "query2"=>"bb", "query3"=>"cc"}

控制器方法看起来像

# getting all query<integer> like params
def your_params
  params.select {|param| param.match?(/query\d/}.permit!
end

【讨论】:

  • query1 和 query2 不是静态的。它可能包含更多的参数。没有严格/允许的查询键。但是,这将有助于我解决其他问题。看,我正在尝试收集和计算所有提供的查询参数,无论是否允许。
  • 它们是否在任何其他参数中命名。例如:用户:[:query1, query2] ?
  • 我正在尝试收集所有用户提供的查询(GET 和 POST)参数并对它们进行哈希处理。这就是为什么我不能允许任何人。这与数据库或任何类似关键的操作无关。
  • 实际上,在我的情况下,许可证可能会更好。关于安全。所以我可以过滤所有不必要的查询,只获取我需要的。
  • 我已经更新了关于如何将query* 参数列入白名单并将白名单列为哈希的答案
【解决方案2】:

在控制器中,您可以访问request 对象。 request 有一个方法 query_parameters,它将返回仅包含显式提供的参数的哈希。

`request.query_parameters`

http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-query_parameters

【讨论】:

  • 这是否也包括用户提供的 POST 参数?哦,同一页显示request_parameters()。所以我会比较和结合它们。
猜你喜欢
  • 2012-04-27
  • 2011-10-05
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多