ruby-on-rails - rails 5.1。 : cannot get JSON object from string

标签 ruby-on-rails json postgresql

我对 JSON 解析有些困惑,因为我是编码新手,这是我第一次处理 JSON :) 我有点想出了如何保存 JSON,但无法从数据库中读回它。

我有这个 Controller :

class Common::DatatablesStatesController < ApplicationController

  require 'json'

  def update
    datatables_state.update(datatable_states_params)
    render json: datatables_state
  end

  def show
    table_state = current_user.datatables_states.where(name: params[:id]).select(:state)
    state = JSON.parse(table_state)
    render json: { state: state["state"] }
  end

  private

  def datatable_states_params
    params['common_datatable_state']['state'] = params['common_datatable_state']['state'].to_json
    params.require(:common_datatable_state).permit(:user_id, :name, :state)
  end

  def datatables_state
    @datatables_state ||= current_user.datatables_states.where(name: params[:id]).first_or_create
  end
end

在终端中,我看到我的 Update 操作正在运行,但是我无法使 Show 操作运行,因为它抛出了这个错误:

TypeError (no implicit conversion of Common::DatatableState::ActiveRecord_AssociationRelation into String):    
app/controllers/common/datatables_states_controller.rb:12:in `show'
app/controllers/application_controller.rb:41:in `set_current_user'

在我的 Pry 中我可以这样做:

[3] pry(main)> user.datatables_states.where(name: 'campaigns_index').select(:state)
  Common::DatatableState Load (0.5ms)  SELECT "common_datatable_states"."state" FROM "common_datatable_states" WHERE "common_datatable_states"."user_id" = $1 AND "common_datatable_states"."name" = $2  [["user_id", 2], ["name", "campaigns_index"]]
=> [#<Common::DatatableState:0x000000028e3f30
  id: nil,
  state:
   "{\"time\":\"1494910215056\",\"start\":\"0\",\"length\":\"10\",\"order\":{\"0\":[\"0\",\"asc\"]},\"search\":{\"search\":\"\",\"smart\":\"true\",\"regex\":\"false\",\"caseInsensitive\":\"true\"},\"columns\":{\"0\":{\"visible\":\"true\",\"search\":{\"search\":\"\",\"smart\":\"true\",\"regex\":\"false\",\"caseInsensitive\":\"true\"}},\"1\":{\"visible\":\"true\",\"search\":{\"search\":\"\",\"smart\":\"true\",\"regex\":\"false\",\"caseInsensitive\":\"true\"}},\"2\":{\"visible\":\"true\",\"search\":{\"search\":\"\",\"smart\":\"true\",\"regex\":\"false\",\"caseInsensitive\":\"true\"}}}}">]

请问如何从数据库的 state 字段(JSON 列,Postgres)中的字符串中获取单个 JSON 对象?谢谢!

更新

这段来自 application_controller.rb 的代码有助于在 Controllers 之外访问 current_user:

#38    around_action :set_current_user
#39      def set_current_user
#40        Current.user = current_user
#41        yield
        ensure
          Current.user = nil
        end

更新 2

在我更新 show 之后:

def show
  table_state = current_user.datatables_states.where(name: params[:id]).select(:state).first
  state = JSON.parse(table_state.state)
  render json: { state: state }
end

我仍然没有看到它用 stateLoadCallback 加载我的 state drom DB|来自以下 JS:

jQuery(document).ready(function() {
  var user_id = $("#data-table").attr('data-user-id');
  var contname = $("#data-table").attr('data-controller-name');
    $('#data-table').DataTable(
            {
                "processing": true,
                "serverSide": true,
                "ajax": $('#data-table').data('source'),
                stateSave: true,
                "stateSaveCallback": function (settings, data) {
                    // Send an Ajax request to the server with the state object
                    $.ajax( {
                        "url": "/common/datatables_states/"+contname+".json",
                        "data": {"common_datatable_state":{"user_id": user_id, "name": contname, "state": data}} ,
                        "dataType": "json",
                        "type": "PATCH",
                        "success": function () {}
                    } );
                },
                   stateLoadCallback: function (settings, callback) {
                      $.ajax( {
                         url: '/common/datatables_states/'+contname+'.json',
                         async: false,
                         dataType: 'json',
                         type: 'GET',
                         success: function (json) {
                         callback( json );
                         }
                    } );
                 }
            }
    );
});

最佳答案

问题是 table_stateCommon::DatatableState 的 ActiveRecord::Relation,正如您在示例中指出的那样。您正在尝试解析不是字符串的关系。

这个怎么样:

table_state = current_user.datatables_states.where(name: params[:id]).select(:state).first
state = JSON.parse(table_state.state)
render json: { state: state }

关于ruby-on-rails - rails 5.1。 : cannot get JSON object from string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44031140/

相关文章:

java - Ruby on Rails,如何使用 Ajax 更新 Div on like/unlike

android - 使用 Retrofit 在 JSON 中上传多部分图像数据?

json - 我实际上如何在 Spotify 应用程序中设置默认选项卡?

postgresql - 使用命令初始化PostgreSQL容器

database - 如何解决 go 编程语言中的数据库结构问题?

ruby-on-rails - Heroku H10 错误但网络测功机没有崩溃

ruby-on-rails - 在haml中使用link_to传递参数

ruby-on-rails - ruby rails : permission denied when using "rails generate controller welcome"

ruby-on-rails - ruby 中具有多个multi_match查询的Elasticsearch DSL

sql - postgresql 函数 : Final statement returns bigint instead of integer