#始めに
Ruby On Railsでcontrollerからmodelフォルダにあるモジュールを呼び出してみる
ARは使いません。
だって、DB周りでうまくいかなくなるのが目に見えているし!
まずは簡単なモジュールから実行してみます
#序章
一般的なRailsのサイトでmodelクラスの話になると
- 意味は分からないけれど、何かコマンド打ってファイル作って
- DBをマイグレーションして
- ARのサブクラスを使って
- DBに接続してなんか表示させる
となると思うが、ここではそんなことをはしない
絶対、DB周りでトラブることは目に見えている
むしろ、railsの何か自動生成するコマンドは一切使わずに、自前で作ったアプリケーションをModelに配置してそれをcotrollerから呼び出してみたい
#サンプルアプリケーションの実行
##ARの解説をしているサイトのサンプルプログラムをもとにロジックを実装してみる
まずはmodelフォルダに
class WORD_DICTIONARY
def getworld()
return "test"
end
end
とめっちゃシンプルなrbクラスを配置する
で、このクラスをARを実装しているサイトのサンプルソースをまねしてcontrollから呼んでみる
class SampleController< ApplicationController
protect_from_forgery :expect => ["create"]
def sayhello
@msgToNikkyusan = '293、hello!';
@msgToPerorisan = 'ペロリさん、hello!';
end
#初期表示で呼ばれるメソッド
def sayhelloToNyukkyusan
@msgToNikkyusan = '293、hello!';
end
#Ajaxから呼ばれるメソッド
def sayhelloasynpost
render text:"こんにちは!#{ WORD_DICTIONARY.new().getworld()}さん"
end
end
ぱっとみ、WORD_DICTIONARYが名前解決できていないような気がしますが、気にしないでブラウザからリクエストを飛ばしてみます
##案の定エラーが出る
ブラウザからリクエストを飛ばしてみると
Started POST "/nikkyuusanpostasyn/" for 0:0:0:0:0:0:0:1 at 2017-07-28 22:16:52 +0900
Processing by SampleController#sayhelloasynpost as */*
Parameters: {"name"=>"triple"}
Can't verify CSRF token authenticity
Completed 500 Internal Server Error in 43ms (ActiveRecord: 0.0ms)
NameError (uninitialized constant SampleController::WORD_DICTIONARY):
app/controllers/sample_controller.rb:21:in `sayhelloasynpost'
案の定、自前で作ったクラス「WORD_DICTIONARY」の名前が解決できていない
まぁ、これは想定内だったので気を取り直して、railsがロードしているパスをコンソールに表示させてみる
railsがロードしているパスはグローバル変数$:から参照できるらしい
自分のrailsのロードパスを一部抜粋してみる
C:/jrubyrails/sample9/lib
C:/jrubyrails/sample9/vendor
C:/jrubyrails/sample9/app/assets
C:/jrubyrails/sample9/app/controllers
C:/jrubyrails/sample9/app/helpers
C:/jrubyrails/sample9/app/mailers
C:/jrubyrails/sample9/app/models
C:/jrubyrails/sample9/app/controllers/concerns
C:/jrubyrails/sample9/app/models/concerns
C:/jruby-9.1.12.0/lib/ruby/gems/
C:/jruby-9.1.12.0/lib/ruby/2.3/site_ruby
C:/jruby-9.1.12.0/lib/ruby/stdlib
ロードされたパスを見るとどうやら、app/models配下はロードされているようだ
##修正したモジュールを実行する
app/models配下がロードされているなら、自作クラスがあるrbをcotroller側からrequireしてあげれば見えるはず
controllerを
require "word_dictironary.rb"
class SampleController< ApplicationController
protect_from_forgery :expect => ["create"]
def sayhello
@msgToNikkyusan = '293、hello!';
@msgToPerorisan = 'ペロリさん、hello!';
end
#初期表示で呼ばれるメソッド
def sayhelloToNyukkyusan
@msgToNikkyusan = '293、hello!';
end
#Ajaxから呼ばれるメソッド
def sayhelloasynpost
render text:"こんにちは!#{ WORD_DICTIONARY.new().getworld()}さん"
end
end
ちゃんと、WORD_DICTIONARY#getworld()が実行されたことがわかる
#結論
おまじないコマンドを打たずにmodelに自前クラスをおいても、railsはその自前クラスを自動的にロードしてくれるわけではない、というごく当たり前のことがわかった
世間一般のARのサンプルプログラムがrequireなしにモデルクラスのクラスをがりがりかけるのは、きっとおまじないコマンドが自動的にrequireしてくれるよう、設定ファイルか何かを書き換えているのだと思う