【Rails】ネストしたルーティングの、コントローラー・ビューでの呼び出し方

TECH::CAMPでプログラミング学習をはじめて11週目。

自分で一からアプリを作ってみると、

スクールのテキストに沿って学習していると出会わなかったエラーに出会います。

それを自分で調べて解決すると、すごく成長を感じます!

 

今回は、Railsでタスク管理アプリを作成していた際に、

groupにtaskをネストすると、

taskコントローラーで@groupを定義できず、

解決するまで時間がかかってしまったのでメモ書きします。

 

ルーティングは下記のような感じです。

Rails.application.routes.draw do
devise_for :users
root "groups#index"
resources :groups do
resources :tasks, except: :index
end
end

 

groupにtaskをネストしています。

group毎にtaskを複数作成するという構造です。

 

tasksコントローラーのcreateアクションは、こう。

def create
@task = @group.tasks.new(task_params)
if @task.save
redirect_to group_path(@group)
else
flash.now[:alert] = 'タイトルを入力してください。'
render :new
end
end

 

taskを作成するときのビューファイル内でのフォームは、下記のように記入します。

views/tasks/new.html.haml

=form_for [@group, @task] do |f|

 

ですが、tasksコントローラーで@groupをただ定義しただけでは、

エラーになってしまいます。

そこで、コントローラーのprivate以下に、下記のように記入します。

def set_group
@group = Group.find(params[:group_id])
end

 

そして、before_action でset_groupメソッドを呼び出します。

before_action :set_group

 

これで、tasksコントローラー内で@groupという変数がいつでも呼び出せるようになりました。

エラー解決!!!

 

ちなみに、親であるgroupsコントローラー内では、

特に定義しなくても下記のように定義が可能です。

@tasks = @group.tasks

 

TECH::CAMPのテキストで習ったのに、すっかり忘れてハマってしまったので、

次はスムーズに作りたい!