我对 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_state
是 Common::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/