Rails コントローラーのクラス変数でインスタンスごとに変数を共有

※ このエントリーの内容は、結局上手くいかなかったので採用しませんでした。なので、参考にしないようにお願いします。最終的には、session に情報を持たせるように変更しました。

ページ遷移をさせるコントローラーのアクションを作っていて、そのページ遷移の範囲だけで変数を共有したいケースに遭遇しました。

スポンサーリンク

— 環境 —
Rails 4.0.1

書いたコード

結局以下のように、共有したい変数をクラス変数で持たせて1ページ目で値をセットする処理にしました。

SomeController#some_action は :page パラメータを受け取り、1~30ページなどページ遷移させるメソッドとします。

1ページ目でクラス変数に値をセットして使い回す

とりあえずページをまたいで変数を共有させるために、@@some_variable とクラス変数として持たせることにしました。@@some_variable はクラス変数なので、2, 3, 4… とページ遷移していっても(別インスタンスでも)、@@some_variable クラス変数はページごとにずっと共有されます。

そして、:page パラメータが1ページ目の時だけ、@@some_variable に値をセットする。DBからランダムに取得したレコード集合をセットする処理なので、ページ遷移後に再び1ページ目をロードするとクラス変数 @@some_variable に新たな値がセットされることになります。

@@some_variable はページ遷移毎に毎回読みだす必要のない値であるし、ページ遷移ごとに毎回DB読み出しをする処理を行いたくない(処理が遅くなるので)。1ページ目で値をセットした後は、それを2ページ目、3ページ目と使い回したい。かつ、再び1ページ目をロードした時は、値の内容が変わる必要がある。これらが条件であったために上述のようなコードにしました。

@some_variable と some_action にインスタンス変数で持たせると、毎回値をセットする処理を行う必要があるし、ページ遷移(別のインスタンス)で変数を共有できません。当たり前かもですけど、Rails は :page パラメータが違うとアクションが同じでも個別のインスタンスとなるようだ。

ページ遷移などコントローラーの一部で共有する変数って、こんな感じのクラス変数を使う方法で良いのかしら?今日のエントリーは私の文章力の欠如により分かりにくいと思うので、通じる自信があまりないのですが。session を使わないと(もしくは使えないと)、コントローラーで(アクション毎に)共有したい変数の処理が結構面倒くさい、というか分かりにくい。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!