Search code examples
ruby-on-railsrubyform-fornested-form-for

Ruby on Rails 4 Can't get form_for working with nested routes


I`m trying to do a form_for with nested routes and I can't get it working.

This is routes.rb

Rails.application.routes.draw do
  resources :users do
    resources :tasks
  end

view/tasks/edit

<h1>Editing task</h1>

<%= form_for [@task.user, :task], method: :put do |f| %>

  <p>
    <%= f.label :Title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :Description %><br>
    <%= f.text_area :description %>
  </p>

  <p>
    <%= f.submit %>
  </p>

  <%= link_to 'Back to List', user_tasks_path %>

<% end %>

rake routes

 Prefix Verb   URI Pattern                              Controller#Action
          root GET    /                                        users#index
    user_tasks GET    /users/:user_id/tasks(.:format)          tasks#index
               POST   /users/:user_id/tasks(.:format)          tasks#create
 new_user_task GET    /users/:user_id/tasks/new(.:format)      tasks#new
edit_user_task GET    /users/:user_id/tasks/:id/edit(.:format) tasks#edit
     user_task GET    /users/:user_id/tasks/:id(.:format)      tasks#show
               PATCH  /users/:user_id/tasks/:id(.:format)      tasks#update
               PUT    /users/:user_id/tasks/:id(.:format)      tasks#update
               DELETE /users/:user_id/tasks/:id(.:format)      tasks#destroy

The Rails gives an error: undefined method `model_name' for :task:Symbol

tasks_controller.rb

class TasksController < ApplicationController
  def index
    @tasks = Task.where(user_id: params[:user_id])
  end

  def show
    @task = Task.find(params[:id])
    redirect_to users_path
  end

  def new
    @task = Task.new
  end

  def create
    @task = Task.new(task_params)

    if @task.save
      redirect_to @task
    else
      render 'new'
    end
  end

  def edit
    @task = Task.find(params[:id])
  end

  def update
    @task = Task.find(params[:id])

    if @task.update(task_params)
      redirect_to [@task.user, @task]
    else
      render 'edit'
    end
  end

  def destroy
    @task = Task.find(params[:id])
    @task.destroy
    respond_to {|format| format.js }
  end

  private

    def task_params
     params.require(:task).permit!
    end
 end

Any help?


Solution

  • Try the below code

    <%= form_for [@task.user, @task], method: :put do |f| %>