【发布时间】:2020-08-13 23:43:45
【问题描述】:
我有一个 Rails API,我试图将一个数字数组传递给我的 postgres 数据库,但我不能:我发送一个包含两个值的数组,它接受一个只有第一个值的数组。
我有 2 个模型,Itinary 和 Event,其中:
class Event
belongs_to: itinary
accepts_nested_attributes_for :itinary
class Itinary
has_many: events
我使用 Postgres 和一个 React 前端以及带有 Postgres 的 Rails API。如果类型为decimal,我声明了一个array 类型的列:
- Rails Postgres 架构:我将
DECIMAL设置为类型:
create_table "itinaries", force: :cascade do |t|
...
t.decimal "start_gps", default: [], array: true
- Rails
EventsController:没什么花哨的,来自Event控制器,create方法是:Event.new(event_params),strong params方法也比较简单:
def event_params
params.require(:event).permit(
...,
itinary_attributes: [..., start_gps: [] ],
...
)
end
我检查了Event.first.itinary.start_gps.class 返回Array。我可以用Itinary.create!(..., start_gps:[45,1]) 播种(值是数字)。
- React 表单:数据在 React 的
FormData中发送,我相信我使用了正确的 Rails 命名约定:
const fdata = new FormData()
fdata.append("events[itinary_attributes][start]", itinary.start)
fdata.append("events[itinary_attributes][start_gps][]", itinary.start_gps)
...
所以我的 POST 请求的标头包含:
event[itinary_attributes][start_gps][]: 45.1936513315257,0.6646728515625
提交时,我得到了几乎所需的参数,但数组中的值被引用:
Parameters:
{"event"=>{
"itinary_attributes"=>{
"date"=>"2020-08-16",
"start"=>"Paris FRA",
"start_gps"=>["48.85011347181819,2.3353889957070355"], << one value ?
}
}
}
这样我在 Postgres 触发时只得到第一个值:
Itinary Create (2.5ms)
INSERT INTO "itinaries" ...
["start_gps", "{48.85011347181819}"], <<<<< ONLY FIRST
^^
]
- 如果我将
t.string或t.text设置为架构中的数据类型,Postgres 会触发:
Itinary Create (2.5ms)
["start_gps", "{\"45.18978009667531,0.6811523437500001\"}"]]
所以Event.last.itinary.start_gps.length 返回 1,一个连接的值:
start_gps: Array(1)
=> "45.158800738352106,1.5051269531250002"
我什至尝试从 React 提交一个字符串数组,但没有成功。从哪儿开始?我相信这是非常经典的东西。看起来 Rails 或 Postgres 无法读取分隔数组中两个值的逗号 ','。
【问题讨论】:
标签: ruby-on-rails postgresql strong-parameters