RailsのSTIでコントローラーをまとめ、Strong Parametersを動的に設定

スポンサーリンク

Rails で STI(Single Table Inheritance)を使う場合、コントローラーを1つにまとめたくなります。そうしないと、STI のサブクラスごとにコントローラを作成する必要があり、とても面倒くさくなってしまうからです。以下の説明等を参考。

[Rails] STI(Single Table Inheritance)でコントローラも一つに纏める | Developers.IO
Rails ActiveRecordのSTI(Single Table Inheritance)の使い方 | EasyRamble

— 環境 —
Rails 4.1.6

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

STI でコントローラーをまとめる

STI でコントローラーをまとめる場合、クラスメソッドさんの記事を参考にしまして、STI モデルのクラス名をパラメーター ( params[:type] )で取得して、new, create のアクション等で動的に STI モデルのオブジェクトを生成します。動的にモデルのオブジェクトを生成するので、Strong Parameters も動的に設定する必要がある。コントローラーのコードとしては、以下のような感じになるかと思います。

STI 利用でのコントローラーのサンプルコード

Strong Parameters を動的に設定する

Strong Parameters の設定で params.require(type_symbol)… のように type_symbol と動的に設定する必要があります。これは、Rails が以下のようにモデル名に対応した params ハッシュのキー(シンボル)を生成するのが理由です。

“SomeModel” => :some_model
“OtherModel” => :other_model
“NameSpace::SomeModel” => :name_space_some_model

type_symbol メソッドで gsub してるのは、NameSpace::SomeModel のようなクラス名に対応するため。以下 pry での動作確認。

Strong Parameters で ActionController::Parameters の params.require(type_symbol).permit() メソッドには配列を渡せる。ソースを見ると分かります。

ActionController::Parameters

これを利用して、parameters メソッドの中で ActiveRecord#column_names メソッドを使って、こちらも動的にカラム名を取得するようにしました。不要なカラムは除外。カラム数が少なければ、以下のような通常通りの指定でも良いかと思います。

こんな感じで Ruby/Rails の動的なパワーを活用すれば、STI 利用時にもコントローラーを1つにまとめられて良い感じです。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!