namespaceとは
・namespace = 名前空間
・メソッド名や変数名が衝突しないようにするための機能で、classやmoduleを使用する。
・衝突とは同名での定義のことである。
・通常同名のメソッドがあった場合にはエラーが発生せずに実行可能なメソッドを実行してしまう。両方とも実行可能な場合は後に定義された方
・同名のメソッドを定義できるように、機能ごとにclassで分ける方法(PostやTweetなど)とmoduleで分ける方法がある。両者の違いは以下
- classはインスタンス化ができる
- moduleはインスタンス化ができない(固定値やメソッドのみをもつ)
module
module A
def self.say_hello
puts "Hello"
end
end
module B
def say_hello
puts "Hello"
end
module_function :say_hello
end
A::say_hello
B::say_hello
module XXX ~ end のようにmoduleを定義する
外部からこのメソッドを実行するにはselfをつけるかmodule_functionを定義する必要がある
module内のメソッドを実行するにはmodule名::メソッド名と記述する
namespaceを用いた機能の管理
管理者機能をまとめたコントローラーをcontroller/admin以下に作成した場合にルーティング生成に必要な記述は以下の通り
product_controller.rb
class Admin::ProductsController < ApplicationController
def index
end
end
adminフォルダ内にあるためAdmin::ProductControllerと表記する
routes.rb
namespace :admin do
resources :products, only: :index
end
namespace :admin do
でフォルダの場所を記述し、その中でproductsコントローラのルーティングを記述する(今回はindexのみ)