LoginSignup
9
15

More than 5 years have passed since last update.

Ruby on rails controllerからmodelのモジュールを呼び出す

Last updated at Posted at 2017-07-28

始めに

Ruby On Railsでcontrollerからmodelフォルダにあるモジュールを呼び出してみる
ARは使いません。
だって、DB周りでうまくいかなくなるのが目に見えているし!
まずは簡単なモジュールから実行してみます

序章

一般的なRailsのサイトでmodelクラスの話になると

  • 意味は分からないけれど、何かコマンド打ってファイル作って
  • DBをマイグレーションして
  • ARのサブクラスを使って
  • DBに接続してなんか表示させる

となると思うが、ここではそんなことをはしない
絶対、DB周りでトラブることは目に見えている
むしろ、railsの何か自動生成するコマンドは一切使わずに、自前で作ったアプリケーションをModelに配置してそれをcotrollerから呼び出してみたい

サンプルアプリケーションの実行

ARの解説をしているサイトのサンプルプログラムをもとにロジックを実装してみる

まずはmodelフォルダに

word_dictironary.rb
class WORD_DICTIONARY 
  def getworld()
    return "test"
  end
end

とめっちゃシンプルなrbクラスを配置する
で、このクラスをARを実装しているサイトのサンプルソースをまねしてcontrollから呼んでみる

sample_controller.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が名前解決できていないような気がしますが、気にしないでブラウザからリクエストを飛ばしてみます

案の定エラーが出る

ブラウザからリクエストを飛ばしてみると

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を

sample_controller.rb
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

のように修正し、リクエストを飛ばすと
image.png

ちゃんと、WORD_DICTIONARY#getworld()が実行されたことがわかる

結論

おまじないコマンドを打たずにmodelに自前クラスをおいても、railsはその自前クラスを自動的にロードしてくれるわけではない、というごく当たり前のことがわかった
世間一般のARのサンプルプログラムがrequireなしにモデルクラスのクラスをがりがりかけるのは、きっとおまじないコマンドが自動的にrequireしてくれるよう、設定ファイルか何かを書き換えているのだと思う

9
15
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
15