Ruby Rails:保存JSON并将其解析回View中的布尔值

时间:2018-11-07 02:28:19

标签: ruby-on-rails ruby-on-rails-4

  

编辑:我需要从数据库中查看boolean true/false,但是问题是,从数据库调用它时,它返回了string。我的datatype中的json_permissionsjson。如我所读并由其他人建议,boolean true/false是有效的json,保存后已经保存为Hash(这是正确的,因为在调试时它将具有{{1 }}格式,如下所示。

如果我在Hash之前调试并查看我的参数表单数据,则它是这样的:

Form Data Params

我这样解析(ActiveAdmin):

.to_json
  

编辑:我现在像这样保存资源(来自.to_json vs JSON.parse的解释:

member_action :update_permissions, method: :put do
   resource.json_permissions = JSON.parse(params.to_json)
   resource.save
   redirect_to admin_group_path(resource)
end

在调试时,它已经是哈希:

binding.pry参数在member_action :update_permissions, method: :put do resource.json_permissions = params.to_json resource.save redirect_to admin_group_path(resource) end 之前

.to_json之后的控制台上,我可以看到它是.to_json(有什么方法可以防止这种情况?)

stringi-fied

然后在我的[["json_permissions", "{\"utf8\":\"✓\",\"_method\":\"put\",\"authenticity_token\":\"kjRYKDQZAMCZPvw/jQZvh0pyCPJ11Q30zROdh8WVohI=\",\"view_accounts\":\"true\",\"view_admin\":\"true\",\"view_admin_users\":\"true\",\"add_edit_admin_users\":\"true\",\"view_groups\":\"true\",\"add_edit_groups\":\"true\",\"view_jobs\":\"true\",\"view_reports\":\"true\",,\"commit\":\"Update Group Permissions\",\"action\":\"update_permissions\",\"controller\":\"admin/groups\",\"id\":\"3\"}"], ["updated_at", "2018-11-09 05:28:19.859162"]] 中在Rails中查看:

show
  

编辑:我将代码更改为以下代码,以确保在show do resource.json_permissions.each do |key, value| if value == "true" || value == "false" resource.json_permissions[key] = !!value end end resource.save render('admin/groups/show', { group: group}) end 之前在boolean上重新分配true/false model

save

保存之前在binding.pry上-在show do resource.json_permissions.each do |key, value| if value == "true" resource.json_permissions[key] = true elsif value == "false" resource.json_permissions[key] = false end resource.save end binding.pry render('admin/groups/show', { group: group}) end 之前的循环内,它现在更改为resource.save

boolean

在装订时,现在使用正确的#<Group id: 3, group_name: "Treasury", group_description: "Treasury Department", active: true, created_at: "2018-10-23 06:08:48", updated_at: "2018-11-09 05:28:19", created_by: "maria.mendoza@sci.ph", updated_by: "maria.mendoza@sci.ph", json_permissions: {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"kjRYKDQZAMCZPvw/jQZvh0pyCPJ11Q30zROdh8WVohI=", "view_accounts"=>true, "view_bank_accounts"=>true, "add_edit_bank_accounts"=>true, "view_recipient_accounts"=>true,.... > 值再次尝试保存后resource/group的内容。 enter image description here

不幸的是,使用boolean运算符,然后再次将其保存为视图,

  

仍然在double bang上返回Hash字符串值

在检查数据库时-确实仍然将其另存为字符串,所以现在不奇怪为什么保存后在调试中没有得到true/false boolean了。

true/false

{ "add_edit_admin_users": "false", "view_user_accounts": "false", "view_reports": "false", ... ... ... } 上有什么事要做,可以将其转换回save吗?

我的表单在string

上看起来像这样
POST
  

编辑:显式重新分配<%= simple_form_for([:admin, resource], url: update_permissions_admin_group_path(resource), method: :put) do |f| %> <div class="panel"> <div class="panel_contents"> <div class="attributes_table"> <ul class="tree" id="tree"> <li> <%= hidden_field_tag 'view_accounts', false %> <%= check_box_tag 'view_accounts', checked = true %> View Accounts <ul> <li> <%= hidden_field_tag 'view_bank_accounts', false %> <%= check_box_tag 'view_bank_accounts', checked = true %> View Bank Accounts </li> <li> 会导致TRICK:)

2 个答案:

答案 0 :(得分:0)

!!string

将始终返回true

!!"false" # true
!!"true"  # true

您可以将作业写为

resource.json_permissions[key][value] = ( value == "true" )

括号是可选的,但是它们增加了可读性。

答案 1 :(得分:0)

show do
   resource.json_permissions.each do |key, value|
       if value == "true"
           resource.json_permissions[key] = true
       elsif value == "false"
           resource.json_permissions[key] = false
       end
       resource.save
     end      
     binding.pry
     render('admin/groups/show', { group: group})
end

像出于某种原因一样,将其显式转换为布尔值。即使在检查我的数据库时,true/false仍保存为字符串。