Hi im struggling with adding a link to delete an object thats nested. I have list application that has many tasks nested like this.
resources :lists do
resource :tasks
end
I have read this post but it does not work for me. I want a link to delete in this code below
<h4>Tasks</h4>
<% @list.tasks.each do |task| %>
<%= task.desc %>
<%= link_to "Delete", list_task_path(list, task), :method => :delete %><br />
<% end %>
But it gives me the following error
undefined local variable or method `list' for #<#<Class:0x007f9adc555db0>:0x007f9adc547828>
EDIT: Now i get the following error when i refreshed the page
No route matches {:action=>"show", :controller=>"tasks", :list_id=>#<List id: 28, name: "Julklappar", user_id: 1, created_at: "2012-12-22 17:40:05", updated_at: "2012-12-22 17:40:05">, :id=>#<Task id: nil, desc: nil, completed: false, list_id: 28, created_at: nil, updated_at: nil>}
Rake routes:
pierre@ubuntu:~/todolist$ rake routes
list_tasks GET /lists/:list_id/tasks(.:format) tasks#index
POST /lists/:list_id/tasks(.:format) tasks#create
new_list_task GET /lists/:list_id/tasks/new(.:format) tasks#new
edit_list_task GET /lists/:list_id/tasks/:id/edit(.:format) tasks#edit
list_task GET /lists/:list_id/tasks/:id(.:format) tasks#show
PUT /lists/:list_id/tasks/:id(.:format) tasks#update
DELETE /lists/:list_id/tasks/:id(.:format) tasks#destroy
lists GET /lists(.:format) lists#index
POST /lists(.:format) lists#create
new_list GET /lists/new(.:format) lists#new
edit_list GET /lists/:id/edit(.:format) lists#edit
list GET /lists/:id(.:format) lists#show
PUT /lists/:id(.:format) lists#update
DELETE /lists/:id(.:format) lists#destroy
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/register(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
root / lists#index
Edit #2
This is my lists/show.html.erb file
<p id="notice"><%= notice %></p>
<h2><%= @list.name %></h2>
<h4>Tasks</h4>
<% @list.tasks.each do |task| %>
<%= task.desc %>
<%= link_to "Delete", list_task_path(@list, task), :method => :delete %>
<% end %>
<%= form_for [@list, @task] do |form| %>
<p><%= form.text_field :desc %> <%= form.submit %></p>
<% end %>
<%= link_to 'Edit', edit_list_path(@list) %> |
<%= link_to 'Back', lists_path %>
lists controller
def show
@list = current_user.lists.find(params[:id])
@task = @list.tasks.new
end
Your link should be:
When looping through
@list.tasks, you are only localizingtaskthrough|task|– but@listalways stays@list.The other problem is in your controller:
@task = @list.tasks.new– your building a new task here, which is needed for your form. However, this task is new, which means it hasn’t been saved yet – you simply cannot build a link to delete it, because it doesn’t exist in the database yet. You can avoid this by building the task directly in the form, not in the controller.Get rid of this line in the controller:
And change your form to: