【Rails】ネストしたルーティングの、コントローラー・ビューでの呼び出し方
TECH::CAMPでプログラミング学習をはじめて11週目。
自分で一からアプリを作ってみると、
スクールのテキストに沿って学習していると出会わなかったエラーに出会います。
それを自分で調べて解決すると、すごく成長を感じます!
今回は、Railsでタスク管理アプリを作成していた際に、
groupにtaskをネストすると、
taskコントローラーで@groupを定義できず、
解決するまで時間がかかってしまったのでメモ書きします。
ルーティングは下記のような感じです。
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
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のテキストで習ったのに、すっかり忘れてハマってしまったので、
次はスムーズに作りたい!