1

この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

modules/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 

controller/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

これは、Sinatraを通常どおり実行すると、次のように完全に機能します。

$ 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}

しかし、これをCherokee Webサーバーにデプロイする必要があるため、このためのラックconfig.ruファイルを作成します...

だから私はファイルmpthmiws.rbを持っています

load 'ws_app.rb'

MPTHMI.run

そして、以下を含むconfig.ruファイル

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

そしてここに行きます:

http://0.0.0.0:9292/battery/1.json

しかし、それから私は有名な「Sinatraはこのくだらないことを知らない-get'/battery/1.json' do"HelloWorld"endを試してみてください

controller / BatteryController.rbファイルから最初のルートを取得し、次のようにws_app.rbファイルのHMIMPTクラス内に配置した場合:

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>

どうすればこれを解決できますか?ありがとう

4

1 に答える 1

1

まず第一に、mpthmiws.rbとconfig.ruのことは非常に複雑です。mpthmiws.rbを削除し、このconfig.ruを使用してrackup config.ru

require './ws_app'

run MPTHMI

昔ながらのアプリを実行する場合は、次のruby ws_app.rbrun.rbファイルを使用します。

require './ws_app'

MPTHMI.run!

それは私たちを次のポイントに導きます:決して使用しないでloadください!ロードされたファイルのコードを実行しますが、定義された変数や関数などは引き継がれません。require代わりに使用してください。ここでは、パスの前に接頭辞を./付けるか、に追加./する必要がありますが、拡張子$LOAD_PATHを省略できます。.rb

次はBatteryController.rbファイルです。次のようになります:require'sinatra / Respond_to'

class BatteryController < Sinatra::Base
  register Sinatra::RespondTo

  get '/battery/:id' do 
     # ...
  end

  get '/batteries' do 
    # ...
  end
end

そして、これはあなたがregisterあなたの拡張機能を必要とするクラスのポイントでもあります。

動作を理解したので、実際にブロックをクラスにロードしているのではなく、クラスの外で実行しloadていることに気付いたかもしれません。それがあなたのアプリがとにかく昔ながらの機能を果たした唯一の理由です!getMPTHMIruby ws_app.rb

次のクラスにコントローラーを適切に含めることができますuse

# require all your gems
# ...

require './models/Battery'
require './controller/BatteryController'

DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/mpt_hmi.sqlite3")

class MPTHMI < Sinatra::Base
    use BatteryController
end

ここで省略することもできregisterます。ご不明な点がございましたら、お気軽にコメントしてください。


そして、これが完全な差分です:

diff --git a/config.ru b/config.ru
index eaa15fe..1568544 100644
--- a/config.ru
+++ b/config.ru
@@ -1,3 +1,3 @@
-load 'mpthmiws.rb'
+require './ws_app'

-run MPTHMI.new
+run MPTHMI
diff --git a/controller/BatteryController.rb b/controller/BatteryController.rb
index 31e4910..c500c48 100644
--- a/controller/BatteryController.rb
+++ b/controller/BatteryController.rb
@@ -1,20 +1,27 @@
-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
+require 'sinatra/respond_to'

-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
-    } 
+class BatteryController < Sinatra::Base
+  register Sinatra::RespondTo
+  
+  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
+
+  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
+
+end
\ No newline at end of file
diff --git a/mpt_hmi.sqlite3 b/mpt_hmi.sqlite3
index e69de29..9897cd9 100644
Binary files a/mpt_hmi.sqlite3 and b/mpt_hmi.sqlite3 differ
diff --git a/mpthmiws.rb b/mpthmiws.rb
deleted file mode 100644
index 87f3406..0000000
--- a/mpthmiws.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-load 'ws_app.rb'
-
-MPTHMI.run
diff --git a/ws_app.rb b/ws_app.rb
index 1cab867..4a6e332 100644
--- a/ws_app.rb
+++ b/ws_app.rb
@@ -1,19 +1,18 @@
 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'
+require './models/Battery'
+require './controller/BatteryController'

-Sinatra::Application.register Sinatra::RespondTo
 DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/mpt_hmi.sqlite3")

 class MPTHMI  < Sinatra::Base
-
-    load 'controller/BatteryController.rb'
+    
+    use BatteryController

 end
于 2012-07-02T10:34:33.450 に答える