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

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

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

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

Q&A

1回答

339閲覧

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

kai20000803

総合スコア29

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/04 14:26

編集2020/08/05 06:50

自分の今のコード

<%= 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の中に二種類の表示をするということです。
どのようなコードを書けばいいでしょうか?わかりや類記事がなかったので質問しました。

完成図の追加

イメージ説明

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

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

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

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

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

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

winterboum

2020/08/04 22:53

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

2020/08/05 04:36

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

2020/08/05 06:17

絵にできません?
kai20000803

2020/08/05 06:32

質問へ絵を追加しました
guest

回答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/05 07:05

winterboum

総合スコア23567

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

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

kai20000803

2020/08/05 09:38

params[:~}ここにはカラム名がくると書いてあったのですが、そのようなカラムがないのですが、どうなんですか?
winterboum

2020/08/05 10:44

ごめん間違えた params[:commit] です。 > 「ここにはカラム名がくる」  一般的はそうですが、submit押すと params[:commit] が来ます。
kai20000803

2020/08/05 11:43

回答に対して質問します。知識がなくてすいません。 1画面直しとは何ですか? 2case params[:commit}~と書いてありますがこれをコントローラのdef update の中に書くということですか? 3そうならばどうしてupdateに書くのですか?formなどで新しい情報を作り出すときはcreateだと思ったんですが、どうしてupdateに書くのかを教えてください 4 ;  このようにセミコロンを使っているのですか?コロンなら使ってきましたが、 5セミコロン以降の(@〜)は何をしようとしているのでしょうか?
kai20000803

2020/08/05 11:44

質問が多くなりましたが回答お願いします。
kai20000803

2020/08/05 22:15 編集

僕がリプライでした質問の五個目は繰り返しを使って表示するためにつくるものですか?
winterboum

2020/08/05 22:41

画面の書き直し とは サーバーにリクエストを送ってそのレスポンスで画面を書き換えることです。で無いのは「非同期」と言われますが、レスポンスでがめの一部だけ書き換えることです。javascriptでやるのが多いです。前者が極普通の方法
winterboum

2020/08/05 22:45

なぜupdateか データを入力する画面に@timelistがわたってますが、これは既にできている Timelistのデータを渡すのではないのでしょうか? そうしますと@timelistを書き直す、ということで update が普通です。 実際にはtimelistは描き直しせずそれに付随するものの新規作成になるにしても、methodはupdateがよいです。form_withの自然の動作がそれです。 createアクションに飛ばせるには、そのための宣言を追加が必要。
winterboum

2020/08/05 22:48

セミコロン rubyでのセミコロンはプログラムセンテンスの終わりを意味します。 when "達成スタート" ; @tasklist.tassei_start は when "達成スタート"   @tasklist.tassei_start とプログラム的には同じです。
kai20000803

2020/08/05 23:58

質問 1 <%= form_with(model: @timelist, local: true) do |f| %> で@timelistと書いたのは教科書に (また、form_with(model: @message) のように、Controller の new アクションで用意した @message を使用してフォームを作成することを明示します) とあったので僕はnewアクションは作らなかったですが、createアクションはつくったのでそれを使えるだろうと思い書いただけです。createでは作れないものですか?データをゼロから入力する時にcreateではなくてupdateなのは引っかかります。 2 すでにできているとはどういうことですか?データを作っていないのですが、
winterboum

2020/08/06 00:07

なるほど、では createですね。@tasklist がまだsaveされていないものでしたらform_withはcreateを呼びます。 saveされたものをDBから呼び出して使うと updateを呼びます。 2回めからその画面をだすと、updateに言ってしまいますから、method optionが必要になりますが、それは次のstepかな
winterboum

2020/08/06 00:09

"達成スタート" ; @tasklist.tassei_start "達成スタート"が押された時にすべきことがありますね?それを; Tasklist に tassei_start メソッドを作って、そこにやらせる という意味です
kai20000803

2020/08/06 01:27

controllerとviewファイルの全ての書くコードとそのコード説明(それぞれのコード書く理由を教えてください) お願いが多いですがお願いします。 このままではコメントのやり取りが続くことになるので。
winterboum

2020/08/06 02:24

それは無いです。 まず自分でやってみて行き詰まったら質問してください
kai20000803

2020/08/06 03:46

では一つ一つ質問していきます。 1 case params[:command] when "達成スタート" ; @tasklist.tassei_start when "達成ストップ" ; @tasklist.tassei_stop とありますが@timelist.tassei_startやstopは何が目的で書いているんですか? 2 formで@timelistを書いていますがそれを使うという意味で.tassei_startのように書いているのですか?
winterboum

2020/08/06 03:57

そのレベルの質問をされると戸惑います。 いままでなにかRailsのアプリ作ったことはありますか?
kai20000803

2020/08/06 04:04

教科書のを真似て作ったことはあります。
kai20000803

2020/08/06 04: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が定義されていないことになります。
kai20000803

2020/08/06 04:47

新しく質問をたてます。
winterboum

2020/08/06 10:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問