tyottomatetya
@tyottomatetya (Mai Matsuhira)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Rails】Chartkickを用いて、保存した値をグラフ化させたい

解決したいこと

入力した値が正常に保存できるようにする(=Chartkickとしてグラフに反映されるようになる)

背景

Ruby on Railsでスマホアプリの利用時間をジャンルごと(例:Twitter,Instagram)にグラフ化させるアプリを開発しています。
現在は、入力した値(使用アプリ名や利用時間など)をChartkickという機能を用いてグラフ化させようとしている段階です。
グラフが表示されるページに戻るボタンを押した際に以下のエラー文が発生しました。(エラー発生時のRailsのバージョン:6.1.5)

これについての解決方法をご教授頂きたいです。

発生している問題・エラー

ActionController::ParameterMissing in PostsController#create
param is missing or the value is empty: post

Action Controller_ Exception caught - Google Chrome 2023_01_31 1_54_38.png
Action Controller_ Exception caught - Google Chrome 2023_01_31 1_56_07.png

該当するソースコード

  private
  def post_params
    params.require(:post).permit(:time, :tag)
  end

end

大元のソースコード

class PostsController < ApplicationController

  before_action :authenticate_user!

  def index
    @posts = Post.all
    if params[:tag]
      Tag.create(name: params[:tag])
    end
    posts = Post.where(user_id: current_user.id)
    @sum = posts.group(:tag).sum(:time)
  end

  def new
    @post = Post.new
    @tags = Tag.all
  end

  def create
    post = Post.new(post_params)
    if post.save
      redirect_to :action => "index"
    else
      redirect_to :action => "new"
    end
  end

  def show
    @post = Post.find(params[:id])
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    post = Post.find(params[:id])
    if post.update(post_params)
      redirect_to :action => "show", :id => post.id
    else
      redirect_to :action => "new"
    end
  end

  def destroy
    post = Post.find(params[:id])
    post.destroy
    redirect_to action: :index
  end

  private
  def post_params
    params.require(:post).permit(:time, :tag)
  end

end

new.html.erb/postsのコード

<h3>新規投稿</h3>

<%= form_tag({controller:"posts",action:"index"}, method: :get) do %>
  アプリ追加:<%= text_field_tag :tag %>
  <%= submit_tag 'タグを追加' %>
<% end %>

<%= form_with(model: @post, url: {controller: 'posts', action: 'create'} ,local: true) do |form|%>
  <div class="form">
      <div class="form-body">
          アプリを選択:<%= form.collection_select(:tag,@tags,:name,:name)%>

          時間:<%= form.number_field :time %>h

          <%= form.submit "保存"%>
      </div>
    </div>
<% end %>
<%= button_to "記録一覧に戻る", posts_path %>

自分で試したこと

・データを保存するためのDBが作られているか確認。
・タグ名やカラム名が定義したものと合っているか確認。
・chartkickに関する複数の資料を混合させて機能をつけようとしてしまったので、1つの資料(「【Ruby on Rails】railsでスタディープラスっぽいもの作ろうとしてみた(グラフ表示)」,参考資料に記載)のみに絞ってやろうとしたが、エラーは解決せず。

参考記事

「【Ruby on Rails】railsでスタディープラスっぽいもの作ろうとしてみた(グラフ表示) 」
https://qiita.com/Yu_unI1/items/c3c977288054560fe0e6

「Chartkickを使って、グラフを作成してみた」
https://qiita.com/pyon_kiti_jp/items/3fda2f9274cbbe6252da

0

1Answer

戻るボタンを押しているのにcreateメソッドが実行されているのが問題のようです。
質問文を追記して戻るボタンがあるviewファイル(erb/slim)を掲載していただければ、より正確な回答を得られるかと思います。

今の情報で考えられるものとしてはpost#createを実行するform内に戻るボタン(submit)があり、押したときにformが発火するなどがあります。

1Like

Comments

  1. @tyottomatetya

    Questioner

    @h_kono0707 さん

    回答して頂き、誠にありがとうございます!
    なるほど!そのような視点がありましたか。createメソッドについては検討したことがありませんでした。

    質問文の方に戻るボタンがあるviewファイルを掲載しましたので,お手すきの際にご確認いただきたいです。
    お忙しいところ恐縮ですが,よろしくお願いいたします。
  2. アクションとして実行してほしいのはGETなので以下のようにすれば動作しませんかね?
    <%= link_to "記録一覧に戻る", posts_path %>
  3. @tyottomatetya

    Questioner

    ありがとうございます。提示して頂いたものの通りに変更したところ、エラーが改善されました。
    ちなみに、何故button_toでは駄目だったのか聞いてもよろしいでしょうか。
    他のログイン機能や投稿削除機能ではbutton_toで正常に作動しているため、気になりました。

Your answer might help someone💌