РЕДАКТИРОВАТЬ: мне нужно пойти и получить в моем представлении boolean
true/false
из моей базы данных, но проблема в том, что при вызове из базы данных он возвращает string
. datatype
моего json_permissions
составляет json
. Как я прочитал и предложил другим boolean
true/false
является действительным json, и при сохранении он уже сохраняется как Hash
(что верно, потому что при отладке он будет иметь формат Hash
, который я покажу ниже ).
Если я отлаживаю и просматриваю данные формы параметров до .to_json
, это выглядит так:
Я разобрал это так (ActiveAdmin):
member_action :update_permissions, method: :put do
resource.json_permissions = JSON.parse(params.to_json)
resource.save
redirect_to admin_group_path(resource)
end
РЕДАКТИРОВАТЬ: Я сохраняю ресурс, как это сейчас (объяснение из .to_json против JSON.parse :
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"]]
Тогда в моем show
для просмотра в Rails:
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
снова.
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
На связывание.pry перед сохранением - внутри цикла прямо перед 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,.... >
При привязке.pry снова проверять содержимое resource/group
после сохранения, теперь с правильными значениями 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>
РЕДАКТИРОВАТЬ: явное переназначение boolean
делает TRICK:)