views:

1098

answers:

4

Hi,

I am absolutely and totally new to rails, so the answer is probably very simple. Here goes:

My page is generating this error

NoMethodError in Tasks#new
Showing app/views/tasks/new.erb where line #3 raised:

undefined method `tasks_path' for #

Here is the view:

<% form_for(@task) do |f| %>
    <%= f.error_messages %>

    <%= f.label :description %>:
    <%= f.text_field :description %><br />

    <%= f.label :priority %>:
    <%= collection_select(:news, :priority_id, Priority.find(:all), :id, :description) %><br />

    <%= f.submit "Add Task" %>

<% end %>

The controller:

class TasksController < ApplicationController
    def index
     @all_tasks = Task.find(:all, :order => :id)
    end

    def new
     @task = Task.new
    end ...(more)

and the model:

I can't see a problem, but like I said, I'm clueless so far. Thanks!

class Task < ActiveRecord::Base
    validates_presence_of :description

    belongs_to :priority
    has_and_belongs_to_many :staff
    has_and_belongs_to_many :catagory

end
+2  A: 

Do you have

map.resources :tasks

in your routes?

Jarrod
Oh, you're right on. After adding that, I was able to use form_for with @task
doctororange
If you've got @task = Task.new in your action, the form_for(@task) references the empty task object. :task would make your form submit to tasks/new instead of a RESTful task/ with method='post'.
Jarrod
A: 

Have you generated this example using the scaffold generator? Because if not it might be that you forgot to define the ressource url mapping in the routes.rb:

--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,6 @@
 ActionController::Routing::Routes.draw do |map|
+  map.resources :tasks
+

Don't forget to restart webrick after you've added the route!

reto
reto
A: 

Thanks for the answers.

As predicted, as simple problem.

<% form_for(@task) do |f| %>

should be:

<% form_for(:task) do |f| %>

Funny how you always find the answer to a question right after you post it! Thanks again.

doctororange
A: 

Regarding this code:

@all_tasks = Task.find(:all, :order => :id)

You don't need to specify order by id because it's the default behavior. So this should suffice.

@all_tasks = Task.find(:all)

And this can be further condensed to the following

@all_tasks = Task.find.all

Furthermore, a rails convention is to name your instance variable @tasks

@tasks = Task.find.all

Have fun with Rails.

allesklar
Thanks.Task.find.all gives the error "Couldn't find Task without an ID"~$ ruby --versionruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]~$ rails --versionRails 2.3.2
doctororange