質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

225閲覧

Rubyのグローバル変数についてご教示お願いします。

koume

総合スコア458

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/01/11 03:30

Rails5.1.3でWebアプリケーションの勉強をしながら制作しています。
どうしてもclassの壁を越えて変数を使いたくてグローバル変数を使用しました。
複数のコントローラで同一のグローバル変数の値を変えていますが、上手く読み込んでくれなくて
困っております。
状態は rails s で起動し、最初に読み込んだコントローラのグローバル変数が保持され続けるのです。
別のコントローラでグローバル変数を変更しても変数の値が変わってくれません。
railsを再起動して別のコントローラを読み込むと今度はそのグローバル変数の値が保持され続けます。
原因がわからないのでご教示お願いします。 コードは以下になります。

CacheEighteensController def edit $quarter20 = 10 @customer = Customer.find(params[:id]) @acc_name = @customer.family_name + ' ' + @customer.given_name @nickname = @customer.nickname @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) end
BonusEighteensController def edit $quarter20 = 20 @customer = Customer.find(params[:id]) @acc_name = @customer.family_name + ' ' + @customer.given_name @nickname = @customer.nickname @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) end
SpecialEighteensController $quarter20 = 30 @customer = Customer.find(params[:id]) @acc_name = @customer.family_name + ' ' + @customer.given_name @nickname = @customer.nickname @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) end
EighteensController if $quarter20 == 10 . . . elsif $quarter20 == 20 . . . else . . . end

のように3種類のコントローラのどれかを読み込むと$quarter20の値が変わりeighteensコントローラで
処理を切り換えたいのです。
しかしrailsを再起動して最初に読み込んだコントローラの$quarter20の値を保持し次に読み込んだ
コントローラの$quarter20に変わってくれません。

たとえばrailsを再起動しBonusEighteensControllerを読み込むと$quarter20の値は20になりますが
次にSpecialEighteensControllerを読み込んでも$quarter20の値は30にならず20のままで
eighteensコントローラの$quarter20 == 20 の処理を行ってしまうのです。

単純に使い方が間違っているのかとも思いましたが解決方法がわからないので
どなたか教えていただけないでしょうか?宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

考えられるのは、Railsアプリケーションが複数のプロセスで起動されて動作している場合ですね。その場合は他のプロセスにはグローバル変数の値が渡らないので、残念ながら期待の動作は行われません。

Railsなら、素直にActiveRecordを使って、DB経由で値を共有させることをおすすめします。

投稿2019/01/12 03:05

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koume

2019/01/13 02:37

回答ありがとうございます。再度コントローラの内容、及びフォームの送信先(url)を見直して解決しました。 edit.html.erbの内容を書き換えて処理内容を分散させシンプルにしました。 変更内容 <%= form_for @twenty_two_form, as: 'form', url: [ :admin, @eighteen_form.eighteen ] do |f| %>を <%= form_for @eighteen_form, as: 'form', url: :admin_cache_eighteen do |f| %>のように変更して解決です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問