Ruby Rails: сохранение JSON и его анализ до логических значений в представлении - PullRequest
0 голосов
/ 07 ноября 2018

РЕДАКТИРОВАТЬ: мне нужно пойти и получить в моем представлении boolean true/false из моей базы данных, но проблема в том, что при вызове из базы данных он возвращает string. datatype моего json_permissions составляет json. Как я прочитал и предложил другим boolean true/false является действительным json, и при сохранении он уже сохраняется как Hash (что верно, потому что при отладке он будет иметь формат Hash, который я покажу ниже ).

Если я отлаживаю и просматриваю данные формы параметров до .to_json, это выглядит так:

Form Data Params

Я разобрал это так (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. enter image description here

К сожалению, использование оператора 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:)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018
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 все еще сохраняется как строка.

0 голосов
/ 07 ноября 2018
!!string

всегда будет возвращать true:

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

Вы можете написать свое назначение как

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

круглые скобки являются необязательными, но они увеличивают читаемость.

...