#前提・実現したいこと
初質問させていただきます。
情報不足もあるかと思いますが、何卒宜しく御願い致します。
####制作物:
タスク管理アプリ
####環境:
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 %>
回答2件
あなたの回答
tips
プレビュー