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

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

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

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

Q&A

解決済

1回答

2777閲覧

変数の代入の仕方がわかりません(はずかしいですけど。。)

tuvalu

総合スコア136

Ruby on Rails

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

0グッド

0クリップ

投稿2016/08/17 09:46

Ruby on Rails 初心者です。
今月になってから、既存のデータをグラフを描画するのに七転八倒しています。

この、teratail で、教えて頂いたことを頼りに、ようやく既存モデルの描画まではできました。
しかし、それは、モデル名.all で、期間の最初から最後まででなんか動的な感じがしません。
モデル名は、Admin::Chart です。

そこで、今日から1ヵ月、3ヵ月、6ヵ月、1年、2年、3年、5年、10年、と期間を指定して
表示させたいのですが、最後の最後(?)変数の受け渡し方が、わかりません。教科書やネットでは、
form_for というモデルと関連したメソッドの説明は多いのですが、今回使うform_tagメソッドの
説明は、やたら難しくて手に負えないか、短すぎて当てはまらないのです。。教えてください。
よろしくお願い致します。

いま、編集しているファイルは、homes/show.html.erb と homes_controller.rb です。
homes/show.html.erb には、
<%= form_tag do %>
<label><%= radio_button_tag :@term, 1 %>1ヶ月</label>
<label><%= radio_button_tag :@term, 3 %>3ヶ月</label>
<label><%= radio_button_tag :@term, 6 %>6ヶ月</label>
<label><%= radio_button_tag :@term, 12 %>1年</label>
<label><%= radio_button_tag :@term, 24 %>2年</label>
<label><%= radio_button_tag :@term, 36 %>3年</label>
<label><%= radio_button_tag :@term, 60 %>5年</label>
<label><%= radio_button_tag :@term, 120, {:checked => true} %>10年</label>
<%= submit_tag "グラフ表示" %>
<% end %>

<%= line_chart @graph_data3 %>

homes_controller.rb には、
def show

@admin_charts = Admin::Chart.all @smomoarray = Admin::Chart.where(keisaiday: (Time.now - 12.month)..Time.now).where('smomo is not 0').pluck(:keisaiday, :smomo) @smunearray = Admin::Chart.where(keisaiday: (Time.now - 12.month)..Time.now).where('smune is not 0').pluck(:keisaiday, :smune) @stotaiarray = Admin::Chart.where(keisaiday: (Time.now - 12.month)..Time.now).where('stotai is not 0').pluck(:keisaiday, :stotai) @graph_data3 = [ {"name"=>"もも肉", "data"=> @smomoarray }, {"name"=>"むね肉", "data"=> @smunearray }, {"name"=>"とたい", "data"=> @stotaiarray } ]

end

と、入力されています。今のこの状態ではグラフは表示されていてうまく動いているようです。
また、12.month のところの 12 を 24 にしたり、60 にしたりしてもうまく動いています。
ここで、このラジオボタンの変数@term を、(Time.now - 12.month)..Time.now) の
12 の所に入るようにしたいので、@term と書き換えると、
NoMethodError in HomesController#show
undefined method `month' for nil:NilClass という、エラーで進まなくなって
しまいました。今日一日かけて探しましたが、解決方法はわかりませんでした。
どなたか教えていただけますでしょうか。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

homes_controller.rbを以下のように書き換えたらエラーが出たということでしょうか?

ruby

1def show 2 3@admin_charts = Admin::Chart.all 4 5@smomoarray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('smomo is not 0').pluck(:keisaiday, :smomo) 6@smunearray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('smune is not 0').pluck(:keisaiday, :smune) 7@stotaiarray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('stotai is not 0').pluck(:keisaiday, :stotai) 8 9@graph_data3 = [ 10{"name"=>"もも肉", "data"=> @smomoarray }, 11{"name"=>"むね肉", "data"=> @smunearray }, 12{"name"=>"とたい", "data"=> @stotaiarray } 13] 14end

発生している状況は以下の通りです。(RailsというよりWEBアプリの基本的な流れになります)

  • ブラウザからURLリクエスト
  • サーバ側でURLに対応するコントローラのメソッド呼び出し(設定が間違っていなければhomes#show
    ⇒この時点で@term = nilなのでエラーになります。

ログを見ていれば@termがnilだからエラーになっていることは分かっていると思います。@termへの値の設定はどのように行われることを想定されていたのでしょうか?
質問の文面からは homes/show.html.erb が最初に処理されて表示されることを想定しているような印象を受けますが、そうであればまず、自分が思った通りに動いているかどうかを確認するために、各所にデバッグプリントを挿入して、ログを読むと良いです。

処理の順序がコントローラ⇒テンプレートということが分かれば、コントローラ内で@termを設定すべきことが分かると思います。

また、フォームで選択した値を渡したいという要求もあることから、リクエストパラメータから値を取得して@termに設定し、リクエストパラメータが無かったら初期値を設定するという処理を入れればよいということが分かります。

次は、リクエストパラメータから値を取得するにはどうすればよいかを調べることになりますが、この程度のことであればググればいくらでも情報は見つかります。(showメソッドではなくeditメソッドでform_forを使用する)

目の前にある手がかりをよく見て、きちんと考えて少しずつ調べていけば問題は解決できます。

投稿2016/08/17 15:19

tkmtmkt

総合スコア1800

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

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

tuvalu

2016/08/17 23:08

ありがとうございます。実はまだ理解できていませんが、すごく大切なポイントだと思っています。わかりたいです!1つずつ教えて頂いたことを順順に追って、咀嚼して消化していきたいと思います。進捗は必ずご連絡致します。ありがとうございます。
tuvalu

2016/08/18 06:20

config/routes.rb に post "home" => "homes#show" を追加しました。 homes/show.html.erb の、<%= form_tag do %> を <%= form_tag("/home", method: "post") do %> に変更しました。
tuvalu

2016/08/18 06:35

homes_controller.rb に、 t = params[:@term].to_i を追加し、 変数にしたい目的の所を、t に置き換えたら、希望通りの動きになりました。 解決しました!ありがとうございます。また、よろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問