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

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

ただいまの
回答率

88.92%

うボタン別に表示先を変える方法

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 129

kai20000803

score 16

自分の今のコード

<%= form_with(model: @timelist, local: true) do |f| %>
    <%= f.label :content, "行動記録" %>
    <%= f.text_field :content %>

    <%= f.submit "達成スタート" %>
    <%= f.submit "達成ストップ" %>
    <%= f.submit "娯楽スタート" %>
    <%= f.submit "娯楽ストップ" %>
  <% end %>

自分がしたいこと

行動をスタートストップを一つの組みとしてみて、行動を記録します。そしてどれだけの時間を使ったのかを記録するものを作ろうとしています。

聞きたいこと

達成と娯楽の二種類に分けて二つの場所にそれぞれ表示したいです。
indexに入力欄を作ってそのindexの中に二種類の表示をするということです。
どのようなコードを書けばいいでしょうか?わかりや類記事がなかったので質問しました。

完成図の追加

イメージ説明

ご   は娯楽
た   は達成
スタートストップの横には時間を表示します。
雑な図ですいません

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • winterboum

    2020/08/05 07:53

    どうしたいのか具体的イメージがわかりません。
    このようにしたいという完成形を示してください

    キャンセル

  • kai20000803

    2020/08/05 13:36

    どれだけの時間を何かの達成や娯楽に使ったかを可視化させるものです。
    表示欄は達成のこと、娯楽のこと半分ずつにしてその上に一つの入力欄がありそこに入力してボタンを押すとそれぞれの場所に表示されます。例えば達成のために行動するときはまずスタートを押します。行動が終わる時に達成ストップをこの時間でできたことを入力してから押します。(そのぞれ投稿の横にボタンを押した時間を表示します)そうすると、行動時間とやったことが可視化されます。娯楽の方も同様です。
    なので、一つの入力欄でそのページに半分は達成の二つのボタン、もう半分に娯楽の二つのボタンが
    表示されるようにしたいです。よって、4つのボタンを二箇所に分けて表示させたいです。

    キャンセル

  • winterboum

    2020/08/05 15:17

    絵にできません?

    キャンセル

  • kai20000803

    2020/08/05 15:32

    質問へ絵を追加しました

    キャンセル

回答 1

0

まずこの画面を表示する controller action とviewを作ってください
今のcodeを修正ですね

4つのボタンを押した時の処理を 非同期にするか そうでなく画面書き直しで良いのか、ですが、最初は後者が良いでしょう。
4つのボタンどれを押しても同じaction、例えば updateで受けるようにします。@timelist が既にできているものでしたら、今の formでそうなります。

そこで
case params[:command]  when "達成スタート" ; @tasklist.tassei_start  when "達成ストップ" ; @tasklist.tassei_stop
の様にして、それぞれの処理を呼びます。
その後「まずこの画面を表示する controller action とviewを作ってください」のactionが用意しているデータを作って、viewを呼びます。

という感じですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/06 13:06

    class TimelistsController < ApplicationController
    before_action :require_user_logged_in
    def index
    @timelist.tassei_start = Timelist.tassei_start
    @timelist.tassei_stop = Timelist.tassei_sotp
    @timelist.goraku_start = Timelist.goraku_start
    @timelist.goraku_stop = Timelist.goraku_stop
    end
    def create
    @timelist = Timelist.new(timelist_params)
    case params[:commit]
    when "達成スタート"
    @timelist.tassei_start
    when params[:commit]
    @timelist.tassei_stop
    when params[:commit]
    @timelist.goraku_start
    when params[:commit]
    @timelist.goraku_stop
    end

    if @timelist.save
    flash.now[:success] = "投稿しました。"
    render "toppages/index"
    else

    flash.now[:danger] = "投稿できませんでした。"
    render "toppages/index"
    end
    end

    def destroy
    @timelist = Timelist.find(params[:id])
    @timelist.destroy

    flash.now[:success] = "行動を記録しました。"
    render "timelists.index"
    end

    def tassei_start
    @timelist = Timelist.find(params[:id])
    end

    def tassei_stop
    @timelist = Timelist.find(params[:id])
    end

    def goraku_start
    @timelist = Timelist.find(params[:id])
    end

    def goraku_stop
    @timelist = Timelist.find(params[:id])
    end

    private


    def timelist_params
    params.require(:timelist).permit(:content)
    end
    end

    回答通り
    tassei_startなどを定義して実行すると定義してはずなのに
    NoMethodError in TimelistsController#index
    undefined method `tassei_start' for #<Class:0x00007f0668083b38>
    Extracted source (around line #4):
    2
    3
    4
    5
    6
    7

    before_action :require_user_logged_in
    def index
    @timelist.tassei_start = Timelist.tassei_start
    @timelist.tassei_stop = Timelist.tassei_sotp
    @timelist.goraku_start = Timelist.goraku_start
    @timelist.goraku_stop = Timelist.goraku_stop

    Rails.root: /home/ec2-user/environment/lifemanagements

    Application Trace | Framework Trace | Full Trace
    app/controllers/timelists_controller.rb:4:in `index'
    Request
    Parameters:

    None
    Toggle session dump
    Toggle env dump
    Response
    Headers:

    None
    このようにtassei_startが定義されていないことになります。

    キャンセル

  • 2020/08/06 13:47

    新しく質問をたてます。

    キャンセル

  • 2020/08/06 19:43

    @timelist.tassei_start は model のmethodを読んでますから、controllerに定義してもだめです

    キャンセル

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

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

関連した質問

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