【问题标题】:Rails 5.1.: cannot get JSON object from stringRails 5.1.:无法从字符串中获取 JSON 对象
【发布时间】:2017-05-17 17:15:20
【问题描述】:

由于我是编码新手,所以我有点卡在 JSON 解析上,这是我第一次处理 JSON :) 我有点想出如何保存 JSON,但无法从 DB 中读回它。

我有这个控制器:

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

在终端中,我看到我的更新操作正在运行,但是我无法使显示操作正常工作,因为它会抛出此错误:

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 中的这段代码有助于访问控制器外部的 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

我仍然没有看到它在下面的 JS 中使用 stateLoadCallback 加载我的 state drom DB:

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 );
                         }
                    } );
                 }
            }
    );
});

【问题讨论】:

  • 说问题出在set_current_user方法上,能贴一下定义吗?
  • @JCorcuera 请参阅上面的更新。
  • @JCorcuera 我从 application_controller.rb 注释掉了 around_action 但是错误仍然存​​在。

标签: ruby-on-rails json postgresql


【解决方案1】:

问题在于 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 }

【讨论】:

  • 谢谢,当我导航到 http://localhost:3000/en/common/datatables_states/campaigns_index.json 时,我看到了不错的 JSON,它似乎可以正常工作,请检查上面的更新 2,为什么我看不到它与我的 @987654325 一起加载@ 在我的 JS 中? stateSaveCallback 部分工作正常。
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多