У меня есть помощник маршрута, который отлично работает, когда он находится в блоке «помощники» в моем файле маршрута, но когда я перемещаю помощника в файл helpers.rb, Я получаю сообщение об ошибке. Вот помощник:Sinatra JSON.parse undefined метод при перемещении помощника в другой файл
def processPutRequest(patient_id, request, _class, foreign_key, route_fragment)
p = Patient.find(patient_id)
data = request.body.read
puts 'request body' + data
data = JSON.parse(data)
host_with_port = request.host_with_port
puts 'hash data: ' + data.inspect
saveListData(params[:id], data, _class, foreign_key)
url = {'url' => "http://#{host_with_port}/patients/#{params[:id]}#{route_fragment}"}.to_json
Rack::Response.new(url)
end
Здесь лесозаготовительной, когда помощник находится в файле маршрута:
request body{"list_data":[{"id":8440,"value":"Removal of ear wax (procedure)"},{"id":9827,"value":"Foreign body in nose (disorder)"}]}
hash data: {"list_data"=>[{"id"=>8440, "value"=>"Removal of ear wax (procedure)"}, {"id"=>9827, "value"=>"Foreign body in nose (disorder)"}]}
И когда я переместить его помощникам файл:
request body{"list_data":[{"id":8440,"value":"Removal of ear wax (procedure)"},{"id":9827,"value":"Foreign body in nose (disorder)"}]}
NoMethodError - undefined method `parse' for Sinatra::JSON:Module:
Am Я пропустил что-то очень простое?
РЕДАКТИРОВАТЬ, отработал отладчик. "Данные" после того, как request.body.read в маршрутах файла:
"{"list_data":[{"id":8440,"value":"Removal of ear wax (procedure)"},{"id":9827,"value":"Foreign body in nose (disorder)"}]}"
в хелперов файле:
"{"list_data":[{"id":8440,"value":"Removal of ear wax (procedure)"},{"id":9827,"value":"Foreign body in nose (disorder)"}]}"
Таким образом, содержание выглядит идентично мне. Я могу буквально вырезать и вставлять этот метод между двумя файлами, он отлично работает в файле маршрутов, не работает с неопределенным анализом метода в файле помощников. Я предполагаю, что я каким-то образом определил этот модуль неправильно или имел дендлинг или отсутствующий символ, но RubyMine не показывает ошибок, и этот метод, по крайней мере, частично выполняется, поэтому метод получает исходный код.
Полное хелперы файл:
module Sinatra
module DynFormat
CONTENT_TYPES={'xml' => 'text/xml','json' => 'application/json'}
def dynamicFormat(data,format=params[:format])
content_type CONTENT_TYPES[format], :charset => 'utf-8'
case format
when 'xml'
data.to_xml
when 'json'
data.to_json
end
end
end
helpers DynFormat
module RouteHelpers
def processPutRequest(patient_id, request, _class, foreign_key, route_fragment)
p = Patient.find(patient_id)
data = request.body.read
puts 'request body' + data
data = JSON.parse(data)
host_with_port = request.host_with_port
puts 'hash data: ' + data.inspect
saveListData(params[:id], data, _class, foreign_key)
url = {'url' => "http://#{host_with_port}/patients/#{params[:id]}#{route_fragment}"}.to_json
Rack::Response.new(url)
end
def saveListData(patient_id, list_data, _class, foreign_key)
p = Patient.find(patient_id)
_class = eval _class
list_data = list_data['list_data']
list_data.each do |x|
_class.create(:patient_id => patient_id, foreign_key => x['id'])
end
end
end
helpers RouteHelpers
end
Вы добавляете "require" ./helpers "в app.rb? – scottxu
Да, и еще один помощник в helpers.rb работает – LukeG
Вы используете что-нибудь из Sinatra contrib? В частности ['Sinatra :: JSON'] (http://www.sinatrarb.com/contrib/json.html), или требуя всех расширений с' require 'sinatra/contrib/all''? – matt