BETA

【Sinatra】機能別にアプリケーションファイルを分けるで!

投稿日:2019-09-09
最終更新:2019-09-09

Sianatraでは一つのアプリケーションファイルでアプリを動かせるようになってます。
アプリの機能が増えると、アプリケーションファイルのコード量が多くなり、かなりみにくくなってくると思います。
そこで、Railsのように機能別にファイルを分けて見やすくしましょう!!

*参照
分割の仕方
https://hawksnowlog.blogspot.com/2018/05/separate-controllers-on-sinatra.html
http://unohanat.hatenablog.com/entry/2018/01/17/202901
reloaderの付け方
http://moco.hatenadiary.com/entry/2015/04/15/040026

すること

ひとつにページに書いていたコードを分けるのでスッキリします。

  • config.ru の作成
  • environment.rb の作成
  • appファイルに少し手を加える
  • モデルを分ける
  • bundle exec rackup config.ru コマンドでアプリを起動する

追加

  • リローダーを追加します。

config.ru

他の方のブログを読むと、config.ru ファイルは必要ないんじゃないかという方もいらっしゃいましたが、ファイルを分けるときは必要になってくるようです。なぜなら、bundle exec rackup config.ru コマンドでconfig.ru ファイルからアプリを起動するからです。
では、コードを見ていきましょう。

require './config/environment' #environment.rbにDBの設定を記述している  

require './app/controllers/home.rb'  
require './controllers/admin.rb'  
require './app/controllers/session.rb'  

run Rack::URLMap.new({  
        '/' => Home,  
        '/admin' => Admin,  
        '/session' => SessionsController  
})  

今回は./app/controllers/~~.rb というように、Rails風にフォルダ分けをしています。そしてrequire で指定したファイルを呼び出しているわけです。

run Rack::URLMap.new 以下では、コントローラクラスとURLを指定しています。
例えとして次のコードを見ましょう。

./app/controllers/home.rb

class Home < Sinatra::Base  

        Bundler.require  

        register Sinatra::Reloader  


        set :root, File.join(File.dirname(__FILE__), '..')  
        set :views, Proc.new { File.join(root, "views") }   

        get '/' do  
                erb :home  
        end  

        get '/users' do  
                'users'  
        end  
end  

こういったコードを記述するとします。するとreqire で指定したファイルの、run Rack::URLMap.new で指定したコントローラクラス(Homeクラス)が呼び出され、ファイルが実行されます。

run Rack::URLMap.new で指定したURLは'/' => Home なので、アプリを起動した際はhttp://localhost:9292/ を開くとerb :home が呼び出されます。
'/session' => SessionsController を見てみると、http://localhost:9292/ でなくhttp://localhost:9292/session/ からURLが始まります。

いちいちURLを書くのがめんどい!と思いきや、管理がめっちゃ楽です。

environment.rb

environment.rb の作成に取り掛かりましょう。と言っても記述するコードは少しです。
configフォルダを作成し、その配下にenvironment.rb ファイルを作成します。
ここではDBの設定のコードを記述します。(dev環境を設定していた方もいました。)

./config/environment.rb

ActiveRecord::Base.establish_connection(  
    adapter: 'sqlite3',  
    database: './db/development.sqlite3'  
  )  

appファイル

appファイルも少し手を加えれば大丈夫です。
./app/controllers/session.rbについて見ていきます。

./app/controllers/session.rb

class SessionsController < Sinatra::Base  

end  

まず、コントローラクラスでコードを囲います。
そして、下記のコードを追記します。

class SessionsController < Sinatra::Base  
  register Sinatra::Reloader  
  set :root, File.join(File.dirname(__FILE__), '..')  
  set :views, Proc.new { File.join(root, "views") }  
  set :models, Proc.new { File.join(root, "models") }  
  Bundler.require  

    #各自のコードを記述してください  

end  

register Sinatra::Reloader は、自動でコードの変更を反映してくれるので便利です。sinatra-reloader をreqireで呼び出す方法が一般的?かもしれませんが、コントローラクラスでコードを囲うとsinatra-reloader が呼び出されなくなってしまいます。

次行のset~~ では、viewファイルとmodelファイルのパスを求めています。
./app/views と、./app/models 内のフォルダを呼び出すことができるようになります。

Bundler.require ではgemファイルに記述されているgemを呼び出すことが出来ます。

これでコードがかなりスッキリしました!

Model

モデルを分けましょう!
appファイルから呼び出せるように設定したので、ファイルを作成し、コードを書くだけです。

./app/models/user.rb

class User < ActiveRecord::Base  

    validates :name, presence: true, length: { maximum: 50 }  
    validates :email, presence: true, length: { maximum: 255 },  
                      format: { with: /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i },  
                      uniqueness: { case_sensitive: false }  
    has_secure_password  
end  

コードの説明は割愛します。

これで、bundle exec rackup config.ru を実行してみましょう!
http://localhost:9292/session/ にアクセスするとアプリが実行されているかと思います!

まとめ

コードがきれいになると見やすくてモチベーションアップしました!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

初学者の成長が垣間見れます

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!