- 更新日: 2014年3月24日
- Rails
Rails コントローラーのクラス変数でインスタンスごとに変数を共有
※ このエントリーの内容は、結局上手くいかなかったので採用しませんでした。なので、参考にしないようにお願いします。最終的には、session に情報を持たせるように変更しました。
ページ遷移をさせるコントローラーのアクションを作っていて、そのページ遷移の範囲だけで変数を共有したいケースに遭遇しました。
— 環境 —
Rails 4.0.1
書いたコード
結局以下のように、共有したい変数をクラス変数で持たせて1ページ目で値をセットする処理にしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class SomeController < ApplicationController @@some_variable = [] def some_action page = params[:page].to_i if page == 1 @@some_variable = [] @@some_variable = ... # @@some_variable にDBからランダムに取得したレコード集合をセット end # ... end end |
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 を使わないと(もしくは使えないと)、コントローラーで(アクション毎に)共有したい変数の処理が結構面倒くさい、というか分かりにくい。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
- 1件のコメント
どうしてこの内容でやって結局うまくいかなかったのですか?
私も同じような状況で、どうやって変数共有させるか迷っています。