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

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

解決済

2回答

619閲覧

コントローラーのアクション内での分岐について

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 04:24

編集2020/02/28 10:22

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

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

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

####制作物仕様: 

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

####現状: 
グループでタスク作成できるが、個人でタスクの作成ができない。
####目標: 
グループに所属していなくても、タスクを作成できる様にしたい。

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

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

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

該当のソースコード

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(params[:group_id]) 12 @task = Task.new 13 # if @task.include(:group_id) 14 15 # @tasks = @group.tasks.includes(:user) 16 # end 17 end 18 19 def create 20 @group = Group.find(params[:group_id]) 21 @task = @group.tasks.new(task_params) 22 if @task.save 23 redirect_to group_task_index_path 24 else 25 render :new 26 end 27 end 28 29 def edit 30 @group = Group.find_by(id: params[:group_id]) 31 end 32 33 def update 34 if @task.update_attributes(task_params) 35 redirect_to :root 36 else 37 render :edit 38 end 39 end 40 41 def destroy 42 @task.destroy 43 redirect_to :root 44 end 45 46 47 48 private 49 def task_params 50 params.require(:task).permit(:title).merge(user_id: current_user.id) 51 end 52 53 def set_task 54 @task = Task.find_by(id: params[:id]) 55 end 56end 57 58

試したこと

newアクションとcreateアクションの条件分岐次第かと仮説しております。
(group_idが含まれている場合と含まれていない場合)

最後に

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

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

#追記

####groupsモデルのコード

groub.rb

1class Group < ApplicationRecord 2 has_many :group_users, dependent: :destroy 3 has_many :users, through: :group_users, dependent: :destroy 4 has_many :tasks, dependent: :destroy 5 6 validates :name, presence: true, uniqueness: true 7end

###Taskモデルのコード

task.rb

1class Task < ApplicationRecord 2 # belongs_to :group 3 belongs_to :user 4 # belongs_to :groups 5 has_many :comments, dependent: :destroy 6 7 # validates :title, length: {in: 1..255} 8end

###個人モデルのコード

user.rb

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 #usernameを必須・一意とする 5 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 has_many :group_users, dependent: :destroy 10 has_many :groups, through: :group_users, dependent: :destroy 11 has_many :tasks, dependent: :destroy 12 13 validates :username, presence: true, length: { maximum: 20 } 14 #usernameを利用してログインするようにオーバーライド 15 def self.find_first_by_auth_conditions(warden_conditions) 16 conditions = warden_conditions.dup 17 if login = conditions.delete(:login) 18 #認証の条件式を変更する 19 where(conditions).where(["username = :value", { :value => username }]).first 20 else 21 where(conditions).first 22 end 23 end 24 25 #emailを不要とする 26 def email_required? 27 false 28 end 29 30 def email_changed? 31 false 32 end 33 34 def will_save_change_to_email? 35 false 36 end 37 38end 39

###変更:グループで作成したタスクの表示画面のビュー
変更前:タスクの新規作成画面のビュー(個人とグループ)

app/views/task/index.html.erb

1<header class="header2"> 2 <nav class="nav2"> 3 <ul class="header_menu2"> 4 <li class="nav-link"> 5 <%= @group.name %> 6 </li> 7 <ul class="header_menu2_inner2"> 8 <li><%= link_to "Create Group Tasks", new_group_task_path(@group), class: "nav-link listNew2" %></li> 9 <li><%= link_to "Edit Group",edit_group_path(@group), class: "nav-link listNew3", method: :get %></li> 10 </ul> 11 </ul> 12 </nav> 13</header> 14 15<div class="topPage"> 16 <div class="taskWrapper"> 17 <% @group.tasks.each do |task| %> 18 <div class="task"> 19 <div class="task_header"> 20 <h2 class="task_header_title"><%= task.title %></h2> 21 <div class="task_header_action"> 22 <%= link_to content_tag(:i, '', class: 'fas fa-trash'), task, method: :delete, data: { confirm: "#{task.title}を本当に削除しますか?" } %> 23 <%= link_to(content_tag(:i, '', class: 'fas fa-pen'), edit_task_path(task)) %> 24 </div> 25 </div> 26 <div class="commentWrapper"> 27 <% task.comments.each do |comment| %> 28 <%= link_to task_comment_path(task, comment), class:"commentDetail_link" do %> 29 <div class="comment"> 30 <h3 class="comment_title"><%= comment.title %></h3> 31 <% if comment.memo.size > 0 %> 32 <div class="comment_detail is-exist"><i class="fas fa-bars"></i></div> 33 <% end %> 34 </div> 35 <% end %> 36 <% end %> 37 <div class="addComment"> 38 <i class="far fa-plus-square"></i> 39 <%= link_to "さらにコメントを追加", new_task_comment_path(task), class: "addComment_link" %> 40 </div> 41 </div> 42 </div> 43 <% end %> 44 </div> 45</div>

###groups, tasks, 個人テーブルの定義

schema.rb

1ActiveRecord::Schema.define(version: 2020_02_25_061850) do 2 3 create_table "comments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 4 t.string "title", null: false 5 t.text "memo" 6 t.bigint "task_id", null: false 7 t.datetime "created_at", null: false 8 t.datetime "updated_at", null: false 9 t.index ["task_id"], name: "index_comments_on_task_id" 10 end 11 12 create_table "group_users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 13 t.bigint "group_id" 14 t.bigint "user_id" 15 t.datetime "created_at", null: false 16 t.datetime "updated_at", null: false 17 t.index ["group_id"], name: "index_group_users_on_group_id" 18 t.index ["user_id"], name: "index_group_users_on_user_id" 19 end 20 21 create_table "groups", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 22 t.string "name", null: false 23 t.datetime "created_at", null: false 24 t.datetime "updated_at", null: false 25 t.index ["name"], name: "index_groups_on_name", unique: true 26 end 27 28 create_table "tasks", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 29 t.string "title", null: false 30 t.bigint "user_id", null: false 31 t.bigint "group_id" 32 t.datetime "created_at", null: false 33 t.datetime "updated_at", null: false 34 t.index ["group_id"], name: "index_tasks_on_group_id" 35 t.index ["user_id"], name: "index_tasks_on_user_id" 36 end 37 38 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 39 t.string "encrypted_password", default: "", null: false 40 t.string "reset_password_token" 41 t.datetime "reset_password_sent_at" 42 t.datetime "remember_created_at" 43 t.datetime "created_at", null: false 44 t.datetime "updated_at", null: false 45 t.string "username", default: "", null: false 46 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 47 end 48 49 add_foreign_key "group_users", "groups" 50 add_foreign_key "group_users", "users" 51 add_foreign_key "tasks", "groups" 52 add_foreign_key "tasks", "users" 53end

#追記2

###タスク作成画面の表示画面
####個人でタスク作成の場合
個人でのタスク作成の現状

  • ozroro 様にご教授頂いた通り、上記task.controller.rb内に対して、Group.find_by(id: params[:group_id])へ変更し、新規作成画面を表示することができました!
  • しかし、下記「タスクの新規作成画面のビュー(個人とグループ)」(app/views/task/index.html.erb)

の条件分岐では、elseの方にいかず、groupの方を読み込んでしまいます。

  • 動画上では、メリーと表示されているheaderはありますが、目標はそのheaderは表示されないこと。

###グループでタスク作成の画面
グループでのタスク作成の現状

  • グループではタスクの新規作成、表示はできる。しかし、バイキンマンと表示されているheaderが、タスク新規作成画面になるとメリーになってしまう。(おそらく、DBのgroupテーブルのidの1を読み込んでいる。

仮説も含めてみました。お手数ですが、何卒ご教授の程宜しく御願い致します。

#追記3
##追記1の上記の「タスクの新規作成画面のビュー(個人とグループ)」は「グループで作成したタスクの表示画面のビュー」でした。申し訳ありませんでした。
###「タスクの新規作成画面のビュー(個人とグループ)」

  • ifとelseで条件分岐しております。
<% - if @group_id.present?%> <header class="header2"> <nav class="nav2"> <ul class="header_menu2"> <li class="nav-link"> <%= @group.name %> </li> <ul class="header_menu2_inner2"> <li><%= link_to "Create Group Tasks", new_group_task_path(@group), class: "nav-link listNew2", method: :get %></li> <li><%= link_to "Edit Group",edit_group_path(@group), class: "nav-link listNew3", method: :get %></li> </ul> </ul> </nav> </header> <div class="tasknewPage"> <div class="container"> <%= form_with model: @task, url: { action: :create }, class: "new_task", local: true do |f| %> <%= f.label :title %> <%= f.text_field :title, autofocus: true, class: "form-control taskName", placeholder: "タスク名" %> <div class="text-center"><%= f.submit "作成", class: "submitBtn" %></div> <% end %> <% else %> <%= form_with model: @task, url: { action: :create }, class: "new_task", local: true do |f| %> <%= f.label :title %> <%= f.text_field :title, autofocus: true, class: "form-control taskName", placeholder: "タスク名" %> <div class="text-center"><%= f.submit "作成", class: "submitBtn" %></div> <% end %> <% end %>

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

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

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

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

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

shinoharat

2020/02/28 08:23

以下の情報を質問文に追記してください。 【1】Group モデルのコード 【2】Task モデルのコード 【3】個人 モデルのコード 【4】新規画面の view 【5】groups, tasks, 個人テーブルの定義(db/schema.rb から該当部分をコピペすればOKです)
raigakun

2020/02/28 08:33

@shinoharat 様 ありがとうございます。 追記いたします。
guest

回答2

0

ベストアンサー

恐らくそのviewは作成でなく表示画面ではないですか?

該当部分のエラーなら単純に

Group.find_by(id: params[:group_id])

とすればエラーはでないです。
findは探してるidがない場合エラーをあげますが
find_byならnilが返ってきます。

あとコメントアウトしてる下記の部分ですが

# if @task.include(:group_id)

@taskインスタンスのgroup_idが入ってるかどうか調べるなら

if @task.group_id.present?

でいいと思います。

投稿2020/02/28 09:35

ozroro

総合スコア97

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

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

raigakun

2020/02/28 09:50

@ozroro 様 ご教授いただきありがとうございます。 ご教授いただいたとおり、 ``` Group.find_by(id: params[:group_id]) ``` に変更いたしましたところ、エラーは出なくなりました。 しかし、次の問題が出ておりまして・・・お手数ですが、ご教授頂けますと幸いです。 詳細は追記いたします。 ありがとうございました。
guest

0

皆様、ご助言いただきありがとうございました。
個人とグループでの別々の投稿画面は出力することができました。ありがとうございます。

#追加したコード

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 26 elsif @tasks.save 27 redirect_to :root 28 else 29 render :new 30 end 31 end 32 33 def edit 34 @group = Group.find_by(id: params[:group_id]) 35 end 36 37 def update 38 if @task.update_attributes(task_params) 39 redirect_to :root 40 else 41 render :edit 42 end 43 end 44 45 def destroy 46 @task.destroy 47 redirect_to :root 48 end 49 50 51 52 private 53 def task_params 54 params.require(:task).permit(:title).merge(user_id: current_user.id) 55 end 56 57 def set_task 58 @task = Task.find_by(id: params[:id]) 59 end 60end 61

次はcreateアクションで詰まってしまっておりますので、別途質問させて頂きます。
何卒宜しく御願い致します。

投稿2020/02/28 12:09

raigakun

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問