applicat-6ren">
gpt4 book ai didi

ruby-on-rails - RestClient 只用最后一个散列去掉散列参数数组?

转载 作者:行者123 更新时间:2023-12-04 01:25:20 27 4
gpt4 key购买 nike

我有一个条件,我需要将参数作为散列数组传递,如下所示:

以下是 API 调用的 Rack::Test post 方法。

post "#{url}.json",
:api_key => application.key,
:data => [{"Company"=>"Apple,Inc","Website"=>"Apple.com"},{"Company"=>"Google","Website"=>"google.com"}],
:run => { :title => "The First Run" }

这是 Rails 应用程序的日志。
Parameters: {"api_key"=>"6a9acb84d0ea625be75e70a1e04d26360606ca5b", "data"=>[{"Company"=>"Apple,Inc", "Website"=>"Apple.com"}, {"Company"=>"Google", "Website"=>"google.com"}], "run"=>{"title"=>"The First Run"}, "line_id"=>"4e018e2c55112729bd00000a"}

现在,这是我用来调用 API 的 RestClient post 方法。
RestClient.post("/lines/#{@line.id}/runs.json", {:run => {:title => @title}, @param_for_input => @param_data})

这是 Rails 应用程序的日志。
Parameters: {"run"=>{"title"=>"run name"}, "data"=>{"Company"=>"Google", "Website"=>"google.com"}, "api_key"=>"f488a62d0307e79ec4f1e6131fa220be47e83d44", "line_id"=>"4e018a505511271f82000144"}

区别在于 data范围。

使用 Rack::Test 方法发送时,数据作为 "data"=>[{"Company"=>"Apple,Inc", "Website"=>"Apple.com"}, {"Company"=>"Google", "Website"=>"google.com"}] 传递

但是通过 RestClient 方式,参数数据数组被剥离,只有最后一个散列作为 "data"=>{"Company"=>"Google", "Website"=>"google.com"} 传递

为什么 RestClient 将散列数组剥离为数组的最后一个散列?

最佳答案

我怀疑这与他们如何将哈希转换为参数的差异有关。 Rack::Test 可能会使用 Hash#to_param,它给出以下结果:

> params = {:api_key => "12345", :data => [{"Company"=>"Apple,Inc","Website"=>"Apple.com"},{"Company"=>"Google","Website"=>"google.com"}], :run => { :title => "The First Run" }}

> paramstring = params.to_param
=> "api_key=12345&data%5B%5D%5BCompany%5D=Apple%2CInc&data%5B%5D%5BWebsite%5D=Apple.com&data%5B%5D%5BCompany%5D=Google&data%5B%5D%5BWebsite%5D=google.com&run%5Btitle%5D=The+First+Run"

> URI.unescape(paramstring)
=> "api_key=12345&data[][Company]=Apple,Inc&data[][Website]=Apple.com&data[][Company]=Google&data[][Website]=google.com&run[title]=The+First+Run"

这是麻烦的部分:

data[][Company]=Apple,Inc&data[][Website]=Apple.com&data[][Company]=Google&data[][Website]=google.com

rails uri 解析器必须读取它并将其转换回散列。在我看来,将一组哈希值放入您的 params 是自找麻烦,因为它会创建一个字符串,就像上面一样,从根本上来说很难解析。例如,提供这两个参数
data[][Company]=Apple,Inc
data[][Company]=Google

解析器可能会决定它们都在名为“data”的数组中的第一个散列中描述 Company 变量,因此用第二个覆盖第一个,这就是您正在发生的事情。

听起来您的问题出在生成阶段而不是解释阶段,但是,我仍然会尝试为您的参数创建一个更清晰的方案,其中数组仅用作参数名称的最后部分,(即使用一个散列而不是一个数组来保存公司数据),然后插入一些唯一的键来区分公司散列。像这样的东西:
{:api_key => "12345", 
:data => {1 => {"Company"=>"Apple,Inc","Website"=>"Apple.com"}, 2 => {"Company"=>"Google","Website"=>"google.com"}},
:run => { :title => "The First Run" }}

1 和 2 可能是某些公司记录的实际 ID,或者它们可能只是您输入的一些数字以制作唯一键,这些数字在另一端被丢弃。这将生成如下参数:
data[1][Company]=Apple,Inc
data[2][Company]=Google

现在没有相互覆盖的危险。

在您随后的 Controller 操作中,这只是执行此操作的更改:
params[:data].each do |company_hash|
#do something with company hash
end


params[:data].each do |k, company_hash|
#do something with company hash and optionally k if you want, or ignore k
end

关于ruby-on-rails - RestClient 只用最后一个散列去掉散列参数数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436110/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com