我有一个应用程序文件,看起来像这样ws_app.rb:屈+机架路由
require 'rubygems'
require 'sinatra'
require 'sinatra/respond_to'
require 'dm-core'
require 'dm-migrations'
require 'dm-timestamps'
require 'json'
require 'csv'
load 'models/Battery.rb'
Sinatra::Application.register Sinatra::RespondTo
DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/mpt_hmi.sqlite3")
class MPTHMI < Sinatra::Base
load 'controller/BatteryController.rb'
end
模块/ Battery.rb看起来像这样:
class Battery
include DataMapper::Resource
property :id, Serial
property :i_battery_manager_id, Integer
property :c_battery_number, String
property :c_battery_state, String
property :c_voltage_byte, String
property :i_voltage_int, Integer
property :i_temperature, Integer
property :i_resistance, Integer
property :i_capacity, Integer
property :i_cell_balancing_duration, Integer
property :i_total_cell_balancing_duration, Integer
property :i_age, Integer
property :i_time_to_service, Integer
property :created_at, DateTime
property :updated_at, DateTime
def to_my_json
{
:i_battery_manager_id => self.i_battery_manager_id,
:c_battery_number => self.c_battery_number,
:c_battery_state => self.c_battery_state,
:c_voltage_byte => self.c_voltage_byte,
:i_voltage_int => self.i_voltage_int,
:i_temperature => self.i_temperature,
:i_resistance => self.i_resistance,
:i_capacity => self.i_capacity,
:i_cell_balancing_duration => self.i_cell_balancing_duration,
:i_total_cell_balancing_duration => self.i_total_cell_balancing_duration,
:i_age => self.i_age,
:i_time_to_service => self.i_time_to_service
}
end
end
控制器/ BatteryController.rb文件看起来像这样:
get '/battery/:id' do
@battery = Battery.get(params[:id])
respond_to do |wants|
wants.html { erb :battery } # html
wants.json { @battery.to_my_json.to_s } # json
end
end
get '/batteries' do
@batteries = Battery.all
respond_to do |wants|
wants.html { erb :batteries } # html
wants.json {
@batteries.all.inject({}) { |hsh, obj|
hsh[obj.id] = obj.to_my_json
hsh
}.to_json
}
end
end
这工作完全当我运行正常西纳特拉,就像这样:
$ ruby ws_app.rb
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
然后去这里:
http://0.0.0.0:4567/battery/5.json
我得到我期待的JSON:
{:i_battery_manager_id=>1, :c_battery_number=>"5", :c_battery_state=>"3", :c_voltage_byte=>"145", :i_voltage_int=>191, :i_temperature=>107, :i_resistance=>81, :i_capacity=>228, :i_cell_balancing_duration=>127, :i_total_cell_balancing_duration=>37, :i_age=>111, :i_time_to_service=>211}
,但我需要一个切诺基Web服务器上部署这一点,所以我想打一个机架config.ru文件...
所以我有一个文件mpthmiws.rb其中包含
load 'ws_app.rb'
MPTHMI.run
并包含
load 'mpthmiws.rb'
run MPTHMI.new
当我运行
$ rackup config.ru
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop
,去这里config.ru文件:
http://0.0.0.0:9292/battery/1.json
但后来我得到了著名的“西纳特拉不知道这个小曲 - 试试'/battery/1.json'做“Hello World”结束
如果我从控制器/ BatteryController.rb文件中的第一条路线,并把它HMIMPT类中的ws_app.rb文件是这样的:
require 'rubygems'
require 'sinatra'
require 'sinatra/respond_to'
require 'dm-core'
require 'dm-migrations'
require 'dm-timestamps'
require 'json'
require 'csv'
load 'models/Battery.rb'
Sinatra::Application.register Sinatra::RespondTo
DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/mpt_hmi.sqlite3")
class MPTHMI < Sinatra::Base
get '/battery/:id' do
@battery = Battery.get(params[:id])
respond_to do |wants|
wants.html { erb :battery } # html
wants.json { @battery.to_my_json.to_s } # json
end
end
end
我得到这个错误:
undefined method `respond_to' for #<MPTHMI:0x00000001240a80>
我该如何解决这个问题? 谢谢
感谢padde,你的变化工作。 JSON视图仍然有效,但html视图不能。 Sinatra响应无法找到batteries.html.erb。我已经把这个文件放在一个名为views的目录中,在我做出更改之前它可以正常工作。有什么想法吗?谢谢 – Dimitri