gpt4 book ai didi

ruby-on-rails - Rails check_box_tag - 将数组保存到 Postgres

转载 作者:行者123 更新时间:2023-11-29 12:54:24 24 4
gpt4 key购买 nike

看起来我的表单做了预期的事情 - 发送了正确的值,但它没有保存在数据库中。 Check_box_tag 从 enum 获取数据(我使用 enum 是因为我对选择字段使用相同的数据):

class UserProfile < ApplicationRecord
enum locations: { Kursenai: 0, Papiskes: 1, Versiai: 2 }

在 form_for 中:

<% UserProfile.locations.each do |key, val| %>
<%= f.label key %>
<%= check_box_tag('user_profile[locations][]', val, false, id: val) %>
<% end %>

但是更新失败:

'["0", "1"]' is not a valid locations

Postgres:

t.integer "locations", array: true

所以我认为它失败了,因为行类型是 integer,但是这个:

<%= check_box_tag('user_profile[locations][].to_i', val.to_i, false, id: val) %>

已删除错误,但用户字段 :locations 仍为 nil。我想念什么?

强参数:

..permit(locations: [])

附注如果您认为这可以以更好的方式完成 - 请随时展示。

最佳答案

为什么?

因为 '["0", "1"]' 被认为是字符串,它不在您在枚举中提到的值中,即 0,1,2。

你不能直接实现它,因为枚举需要字段类型来保存单个值。但在你的情况下它是一个数组。

如何实现?

class UserProfile < ApplicationRecord
# value should store as array not as string.
serialize :locations, Array

# define your own enum by creating static var.U can use Array or Hash structure.
# Here I am using Hash.
# ENUM_LOCATIONS = ["Kursenai", "Papiskes", "Versiai"]
ENUM_LOCATIONS = {"Kursenai": 0, "Papiskes": 1, "Versiai": 2}


# Now modify you getter little bit to return enumed values
def locations
res = []
self[:locations].each{|v| ENUM_LOCATIONS.is_a?(Array) ? res << ENUM_LOCATIONS[v.to_i] : res << ENUM_LOCATIONS.key(v.to_i).to_s}
res
end

end

就是这样。

关于ruby-on-rails - Rails check_box_tag - 将数组保存到 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46842241/

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