前提・実現したいこと
最終的に実装したいのは、ユーザーの参加申請を承認する機能です。
〜実現したい承認機能の流れ〜
①ユーザーAが管理するチームに、別のユーザーBが参加の応募申請をする。
②ユーザーAが申請待ち一覧を確認して、申請の承認or却下を選ぶ。
③参加を承認した場合、参加承認リストにuserが追加され、申請待ち一覧から削除する。
④参加を却下した場合、申請待ち一覧から削除する。
ユーザーB視点で見ると、「応募したチームの一員になる」のではなく、「チームの練習に参加する承認をもらう」イメージです。
発生している問題・エラーメッセージ
申請一覧画面(applies#index
)を読み込む段階で、下記のエラーが発生しています。
該当のソースコード
ルーティング
Rails.application.routes.draw do devise_for :users root to: "teams#index" resources :teams do resources :applies, only: [:index, :create, :destroy] resources :approves, only: [:create, :destroy] end resources :users, only: :show end
エラーページへの遷移元(チーム詳細ページ)
teams/showからは、次のことが可能です。
①「ユーザーBはチームへの応募ができる」(applies#createへ)
②「ユーザーBはチームへの応募を取り消せる」(applies#destroyへ)
②「チーム管理者は申請一覧ページへの遷移できる」(applies#indexへ)
app/views/teams/show.html.erb
1 <% if user_signed_in? && current_user.id != @team.user_id %> 2 <div class="team-apply"> 3 <% if @team.applied?(current_user) %> 4 <%= link_to "このチームへの応募を取り消す", team_apply_path(@team.id), method: :delete %> 5 <% else %> 6 <%= link_to "このチームに応募する", team_applies_path(@team.id), method: :post %> 7 <% end %> 8 </div> 9 <% end %> 10 11 <% if user_signed_in? && current_user.id == @team.user_id %> 12 <%= link_to "申請承認待ち一覧ページ", team_applies_path(@team.id) %> 13 <% end %>
該当のエラーページ(参加申請一覧ページ)
applies/indexでは、次のことが可能です。
①「そのチームへの応募状況の確認」
②「チーム管理者は、申請の承認ができる」(approves#createへ)
③「チーム管理者は、申請の却下ができる」(approves#destroyへ)
→ここの記述をすると、applies#index
の読み込み段階でエラーが発生!
app/views/applies/index.html.erb
1 <div class="team-contents"> 2 <h2 class="title"><%= current_user.nickname %> さんのチームへの応募申請</h2> 3 <ul class="team-lists"> 4 <% @applies.each do |apply| %> 5 <li class="list"> 6 #省略 7 <%= link_to "参加を却下する", team_approfe_path(user_id: apply.user_id, team_id: apply.team_id), method: :delete %> 8 <%= link_to "参加を承認する", team_approves_path(user_id: apply.user_id, team_id: apply.team_id), method: :post %> 9 </li> 10 <% end %> 11 </ul> 12 </div>
appliesコントローラー
class AppliesController < ApplicationController before_action :authenticate_user! def index @applies = Apply.where(team_id: params[:team_id]) end def create @team_apply = Apply.new(user_id: current_user.id, team_id: params[:team_id]) if @team_apply.save redirect_to team_path(params[:team_id]) end end def destroy @team_apply = Apply.find_by(user_id: current_user.id, team_id: params[:team_id]) @team_apply.destroy redirect_to team_path(params[:team_id]) end end
approvesコントローラー
app/controllers/approves_controller.rb
1class ApprovesController < ApplicationController 2 3 def create 4 approve = Approve.new(user_id: approve_params[:user_id], team_id: approve_params[:team_id]) 5 approve.save 6 redirect_to root_path 7 end 8 9 def destroy 10 apply = Apply.find_by(user_id: approve_params[:user_id], team_id: approve_params[:team_id]) 11 apply.destroy 12 redirect_to root_path 13 end 14 15 private 16 def approve_params 17 params.permit(:user_id, :team_id) 18 end 19end
試したこと
・試しにエラー元の「参加を却下する」に関連するlink_toメソッドを削除すると、applies#index
の画面は正常に表示されました。
・現時点では、approves#createにおける「承認したユーザーを申請一覧から削除」の記述もうまく実装することができていません。
・「approves#destroyのパスの引数に、idが見つからない」という旨のエラー文かと思い、apply.id
を引数に渡してみましたが、同じくUrlGenerationErrorが出てしまいました。
補足情報(FW/ツールのバージョンなど)
プログラミング初心者ゆえ、至らない記述も多いかと思いますが、どうか皆様のお力添えを頂ければと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/22 16:17