IT技術にまつわる実験ノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

Rails でネストした Resource を使ってみる

前提

ここでは、以下の記事を写経したアプリを使うことにする。

 

テーブルの関係は、以下のようになっている。

f:id:matt-note:20190201141723p:plain

 

config/routes.rb では、この関係を resources のネストで表現する。

f:id:matt-note:20190201153952p:plain

 

アプリを作成したら、コンソールからデータを作成する。

f:id:matt-note:20190201155505p:plain

f:id:matt-note:20190201155515p:plain

 

サーバーを起動して、アクセスしてみる。

f:id:matt-note:20190201140640p:plain

 

params の値を調べてみる

リソースをネストした場合の params の値を出力してみる。/groups/1/users にアクセスしてみる。

f:id:matt-note:20190201160346p:plain

f:id:matt-note:20190201160428p:plain

-> index アクションでは、params に group_id が含まれている。また、params[:group_id] で、値の1を出力している。

以下のコードは、データベースの groups テーブルから id が 1 のレコードを検索している。

f:id:matt-note:20190201162106p:plain

 

show アクションを実行してみる。 /groups/1/users/1 にアクセスしてみる。

f:id:matt-note:20190201160243p:plain

f:id:matt-note:20190201160314p:plain

-> show アクションでは、params に group_id と id が含まれている。ここでの id は User の id で、この id で個別のユーザーを識別することになる。


params は ActionController::Parameters クラスのインスタンスということがわかった。また、ActionController::Parameters クラスの親クラスは Object とのこと。Hash じゃなかったのか…。

名前付きルートを使ってみる

ネストしたリソースで名前付きルートを使う場合は、以下のようになる。

users#index アクションへのパスの場合:

f:id:matt-note:20190201150853p:plain

f:id:matt-note:20190201150922p:plain

->どのグループかが分かれば良いので、group_id だけを指定する。このパスで以下のようなリンクが作成される。

f:id:matt-note:20190201152824p:plain

 

users#show アクションへのパスの場合:

f:id:matt-note:20190201151251p:plain

f:id:matt-note:20190201151410p:plain

-> グループとユーザーを指定する必要があるので、引数を2つ渡す必要がある。このパスで以下のようなリンクが作成される。

f:id:matt-note:20190201153105p:plain

 

というわけで、ネストしたリソースで名前付きルートを作成場合、index, new, post アクションでは group_id を指定する必要がある。それ以外の show, edit, update, delete アクションでは group_id とユーザーの id の2つを指定する必要がある。

 

まとめ

ネストしたリソースで、集合から個別のものを識別する場合は、集合_id と個別の id の2つを使用する。集合だけを識別したい場合は、集合_id だけを使用する。