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

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

ただいまの
回答率

90.40%

  • Ruby on Rails

    9299questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,242

tuvalu

score 114

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 という、エラーで進まなくなって
しまいました。今日一日かけて探しましたが、解決方法はわかりませんでした。
どなたか教えていただけますでしょうか。よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

def show

@admin_charts = Admin::Chart.all

@smomoarray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('smomo is not 0').pluck(:keisaiday, :smomo) 
@smunearray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('smune is not 0').pluck(:keisaiday, :smune) 
@stotaiarray = Admin::Chart.where(keisaiday: (Time.now - @term.month)..Time.now).where('stotai is not 0').pluck(:keisaiday, :stotai)

@graph_data3 = [ 
{"name"=>"もも肉", "data"=> @smomoarray }, 
{"name"=>"むね肉", "data"=> @smunearray }, 
{"name"=>"とたい", "data"=> @stotaiarray } 
] 
end

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/18 08:08

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

    キャンセル

  • 2016/08/18 15:20

    config/routes.rb に
    post "home" => "homes#show" を追加しました。

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

    キャンセル

  • 2016/08/18 15:35

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

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    9299questions

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