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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Sequel Pro

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

2710閲覧

Createアクションの条件分岐方法についてご教授願います。

raigakun

総合スコア7

Sequel Pro

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2020/02/28 12:32

編集2020/02/29 01:45

#前提・実現したいこと
2度目の質問させていただきます。
情報不足もあるかと思いますが、何卒宜しく御願い致します。

####制作物: 
タスク管理アプリ

####環境: 
macOS Catalina ver10.15.3 、 rails (~> 5.2.3) 、  ruby 2.6.3p62

####制作物仕様: 

  • 個人で個人情報の編集、削除可能。
  • グループの作成可能。
  • グループでタスク作成可能。      

####現状: 
個人、グループ、どちらもタスクの作成画面までは、出力できている。
グループでタスク作成できる(createアクションが機能している)が、個人でタスクの作成ができない。
####目標: 
グループに所属していなくても、タスクを作成できる様にしたい。
createアクション内の記述方法次第かと考えてます。

発生している問題・エラーメッセージ

taskのコントローラーのcreateアクション記述方法次第で、目標達成できると仮説しております。

個人でタスク作成する画面でのエラーメッセージ

該当のソースコード

createアクションについては、試行錯誤しております。見にくく申し訳ありません。
task_controller.rb

task_controller.rb

1 2class TaskController < ApplicationController 3 4 before_action :set_task, only: [:edit, :update, :destroy] 5 6 def index 7 @group = Group.find_by(id: params[:group_id]) 8 end 9 10 def new 11 @group = Group.find_by(id: params[:group_id]) 12 @task = Task.new 13 end 14 15 def create 16 @group = Group.find_by(id: params[:group_id]) 17 @task = @group.tasks.new(task_params) 18 # @task = Task.new(task_params) 19 # if @group_id.present? 20 # @group = Group.find_by(id: params[:group_id]) 21 # @group.tasks.save 22 # redirect_to group_task_index_path(@group) 23 # elsif 24 if @task.save 25 redirect_to group_task_index_path(@group) 26 else 27 render :new 28 end 29 end 30 31 def edit 32 @group = Group.find_by(id: params[:group_id]) 33 end 34 35 def update 36 if @task.update_attributes(task_params) 37 redirect_to :root 38 else 39 render :edit 40 end 41 end 42 43 def destroy 44 @task.destroy 45 redirect_to :root 46 end 47 48 49 50 private 51 def task_params 52 params.require(:task).permit(:title).merge(user_id: current_user.id) 53 end 54 55 def set_task 56 @task = Task.find_by(id: params[:id]) 57 end 58end

###newアクションについて
こちらでご対応いただき、newアクションについては目標物に近づけることができました。ありがとうございました。

###最後に
必要な情報等ございましたら、ご教授頂けますと幸いです。

以上、お手数ですが、何卒ご教授の程宜しく御願い致します。

#追記1
###grop の場合と 個人の場合で createに渡ってくる情報が各々どうなのか、というデータ
以下、task_controller内のcreateアクションにてbinding.pryを追記しました。
group_idの有無で条件分岐を試みてます。

task_controller.rb

1class TaskController < ApplicationController 2 3 before_action :set_task, only: [:edit, :update, :destroy] 4 5 def index 6 @group = Group.find_by(id: params[:group_id]) 7 end 8 9 def new 10 @group = Group.find_by(id: params[:group_id]) 11 @task = Task.new 12 end 13 14 def create 15 binding.pry 16 if @group = Group.find_by(id: params[:group_id]) 17 @task = @group.tasks.new(task_params) 18 else 19 @task = Task.new(task_params) 20 end 21 if @task.save 22 redirect_to group_task_index_path(@group) 23 else 24 render :new 25 end 26 end 27 28 def edit 29 @group = Group.find_by(id: params[:group_id]) 30 end 31 32 def update 33 if @task.update_attributes(task_params) 34 redirect_to :root 35 else 36 render :edit 37 end 38 end 39 40 def destroy 41 @task.destroy 42 redirect_to :root 43 end 44 45 46 47 private 48 def task_params 49 params.require(:task).permit(:title).merge(user_id: current_user.id) 50 end 51 52 def set_task 53 @task = Task.find_by(id: params[:id]) 54 end 55end 56

###個人でタスクを新規作成
実際のビュー
binding.pry後、ターミナルの画面

###グループでタスクを新規作成
実際のビュー
binding.pry後、ターミナルの画面

###タスクの新規作成のコード(個人とグループでviewが異なる様に、条件分岐を用いております。)

app/views/task/new.html.erb

1<% - if @group.present?%> 2 <header class="header2"> 3 <nav class="nav2"> 4 <ul class="header_menu2"> 5 <li class="nav-link"> 6 <%= @group.name %> 7 </li> 8 <ul class="header_menu2_inner2"> 9 <li><%= link_to "Create Group Tasks", new_group_task_path(@group), class: "nav-link listNew2", method: :get %></li> 10 <li><%= link_to "Edit Group",edit_group_path(@group), class: "nav-link listNew3", method: :get %></li> 11 </ul> 12 </ul> 13 </nav> 14 </header> 15 <div class="tasknewPage"> 16 <div class="container"> 17 <%= form_with model: @task, url: { action: :create }, class: "new_task", local: true do |f| %> 18 <%= f.label :title %> 19 <%= f.text_field :title, autofocus: true, class: "form-control taskName", placeholder: "タスク名" %> 20 <div class="text-center"><%= f.submit "作成", class: "submitBtn" %></div> 21 <% end %> 22 23<% else %> 24aaa 25 <%= form_with model: @tasks, url: { action: :create }, class: "new_task", local: true do |f| %> 26 <%= f.label :title %> 27 <%= f.text_field :title, autofocus: true, class: "form-control taskName", placeholder: "タスク名" %> 28 <div class="text-center"><%= f.submit "作成", class: "submitBtn" %></div> 29 <% end %> 30<% end %>

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

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

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

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

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

winterboum

2020/02/28 14:30

grop の場合と 個人の場合で createに渡ってくる情報が各々どうなのか、というデータを載せてください 何を条件に分岐したら良いのか、がわからない
raigakun

2020/02/28 23:05

winterboum様 ご教授頂きありがとうございます。 Createアクションでbinding.pryを行い、個人の場合とグループの場合のタスク新規作成画面からどのような情報が出ているかをターミナル上で確認します。少々お待ち頂けますと幸いです。 何卒よろしくお願いします。
guest

回答1

0

ベストアンサー

多分でしかないが

ruby

1 def create 2 if @group = Group.find_by(id: params[:group_id]) 3 @task = @group.tasks.new(task_params) 4 else 5 @task = Task.new(task_params) 6 end 7 if @task.save 8 redirect_to group_task_index_path(@group) 9 else 10 render :new 11 end 12 end

追記

ruby

1 if @group 2 redirect_to group_task_index_path(@group) 3 else 4 redirect_to :root 5 end

で出来るとは思いますが
分岐して、共通処理して、また同じ条件で分岐するというのはあまりよくないですね。
後からコードを読む人が共通処理によって条件が変化する可能性を考慮する必要があるのが駄目です。

なので、次善としては

ruby

1 def create 2 if @group = Group.find_by(id: params[:group_id]) 3 @task = @group.tasks.new(task_params) 4 if @task.save 5 redirect_to group_task_index_path(@group) 6 else 7 render :new 8 end 9 else 10 @task = Task.new(task_params) 11 if @task.save 12 redirect_to :root 13 else 14 render :new 15 end 16 end 17 end

ruby

1def create 2 if @group = Group.find_by(id: params[:group_id]) 3 group_create(@group, task_params) 4 else 5 private_create(task_params) 6 end 7end 8 9def group_create(group, param) 10 @task = group.tasks.new(param) 11 if @task.save 12 redirect_to group_task_index_path(group) 13 else 14 render :new 15 end 16end 17def private_create(param) 18 @task = Task.new(task_params) 19 if @task.save 20 redirect_to :root 21 else 22 render :new 23 end 24end

もしくは

ruby

1def create 2 @group = Group.find_by(params[:group_id]) 3 success_path, @task = if @group 4 [group_task_index_path(@group), @group.tasks.new(task_params)] 5 else 6 [:root, Task.new(task_params)] 7 end 8 if @task.save 9 redirect_to success_path 10 else 11 render :new 12 end 13end

ですかね

投稿2020/02/28 23:21

編集2020/02/29 03:08
asm

総合スコア15147

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

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

raigakun

2020/02/29 01:32

asm 様 ご教授いただきありがとうございます。 早速、試してみたところ、下記のリンク先のエラーが出てしまいました。 https://gyazo.com/97006ed8a16ce6fd499940f9253e1b7a params内も変更が必要なのでしょうか。 何卒宜しく御願い致します。
asm

2020/02/29 02:03

> <%= form_with model: @tasks, url: { action: :create }, class: "new_task", local: true do |f| %> @taskの間違いではないでしょうか? それとも、なにか違いがあり@tasksにしなければいけない理由があるのですか?
raigakun

2020/02/29 02:10

asm 様 ご教授いただきありがとうございます。 ご指摘の通り、@taskです。特段理由もありませんでした。申し訳ありません。
raigakun

2020/02/29 02:17

asm 様 重ねて、ご教授・ご助言頂けますと幸いです。 ご指摘いただいた通り、@tasks → @task へ訂正しました。その結果、以下のエラーが出ました。 https://gyazo.com/9328d5ac29c83bcd4f91f364692d6f16 仮説では、個人でcreateしたタスクの反映先はgroup_idが必要な場所(グループがタスクを作成した場合に反映する場所)になっているためのエラーと思っております。 ですので、反映先を変更すれば、解決すると思われます。(例えば、redirect_to :root) しかし、その記述に変更した場合、グループで作成したタスクも反映先が変わってしまします。 反映先も条件分岐できるのでしょうか。 わかりづらい文章で申し訳ありませんが、何卒宜しく御願い致します。
raigakun

2020/02/29 03:38

asm 様 お忙しい中、ご教授いただきありがとうございます。 ご助言いただいた通り、記載致しましたところ、目標通りの動きができました。ありがとうございます。 asm 様がおっしゃる通り、第三者のことを考えたコードを書ける様に日々学習いたします。 とても勉強になりました。またご教授頂くことがあるかと思いますが、その際は何卒宜しく御願い致します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問