Fun with Routing Errors

I'm at a complete loss. I can get to new and edit and when I submit the new post or submit the edit, i'll get:

Routing Error No route matches "/knodes/new"

or

Routing Error No route matches "/knodes/1/edit"

Here's the controller: class KnodesController < ApplicationController     before_filter :authenticate, :only => [:create, :destroy]     before_filter :authorized_user, :only => :destroy

   # GET /knodes      # GET /knodes.xml    def index      @knodes = Knodes.all    end

   # GET /knodes/1    # GET /knodes/1.xml    def show      @knodes = Knodes.find(params[:id])    end

   # GET /knodes/new    # GET /knodes/new.xml    def new      @knodes = Knodes.new    end

   # GET /knodes/1/edit    def edit      @knodes = Knodes.find(params[:id])    end

   # POST /knodes    # POST /posts.xml    def create      @knodes = current_user.knodes.build(params[:knodes])      if @knodes.save        redirect_to @user      else        render 'edit'      end    end

     # PUT /knodes/1    # PUT /knodes/1.xml    def update      @knodes = Knodes.find(params[:id])

     if @knodes.update_attributes(params[:knodes])        redirect_to @knodes      else        render 'edit'      end    end

   # DELETE /knodes/1    # DELETE /knodes1.xml    def destroy      @knodes = Knodes.find(params[:id])      @knodes.destroy

     respond_to do |format|        format.html { redirect_to(knodes_url) }        format.xml { head :ok }      end    end

   private

   def authorized_user      @knodes = Knodes.find(params[:id])      redirect_to root_path unless current_user?(@knodes.user)    end end

And my routes

   sessions_new GET /sessions/new(.:format) {:controller=>"sessions", :action=>"new"}      knodes_new GET /knodes/new(.:format) {:controller=>"knodes", :action=>"new"}       users_new GET /users/new(.:format) {:controller=>"users", :action=>"new"}      pages_home GET /pages/home(.:format) {:controller=>"pages", :action=>"home"}     pages_about GET /pages/about(.:format) {:controller=>"pages", :action=>"about"}   pages_contact GET /pages/contact(.:format) {:controller=>"pages", :action=>"contact"} pages_changelog GET /pages/changelog(.:format) {:controller=>"pages", :action=>"changelog"}         contact /contact(.:format) {:controller=>"pages", :action=>"contact"}           about /about(.:format) {:controller=>"pages", :action=>"about"}          signup /signup(.:format) {:controller=>"users", :action=>"new"}          signin /signin(.:format) {:controller=>"sessions", :action=>"new"}         signout /signout(.:format) {:controller=>"sessions", :action=>"destroy"}       changelog /changelog(.:format) {:controller=>"pages", :action=>"changelog"}          knodes GET /knodes(.:format) {:controller=>"knodes", :action=>"index"}          knodes POST /knodes(.:format) {:controller=>"knodes", :action=>"create"}       new_knode GET /knodes/new(.:format) {:controller=>"knodes", :action=>"new"}      edit_knode GET /knodes/:id/edit(.:format) {:controller=>"knodes", :action=>"edit"}           knode GET /knodes/:id(.:format) {:controller=>"knodes", :action=>"show"}           knode PUT /knodes/:id(.:format) {:controller=>"knodes", :action=>"update"}           knode DELETE /knodes/:id(.:format) {:controller=>"knodes", :action=>"destroy"}           users GET /users(.:format) {:controller=>"users", :action=>"index"}           users POST /users(.:format) {:controller=>"users", :action=>"create"}        new_user GET /users/new(.:format) {:controller=>"users", :action=>"new"}       edit_user GET /users/:id/edit(.:format) {:controller=>"users", :action=>"edit"}            user GET /users/:id(.:format) {:controller=>"users", :action=>"show"}            user PUT /users/:id(.:format) {:controller=>"users", :action=>"update"}            user DELETE /users/:id(.:format) {:controller=>"users", :action=>"destroy"}        sessions GET /sessions(.:format) {:controller=>"sessions", :action=>"index"}        sessions POST /sessions(.:format) {:controller=>"sessions", :action=>"create"}     new_session GET /sessions/new(.:format) {:controller=>"sessions", :action=>"new"}         session DELETE /sessions/:id(.:format) {:controller=>"sessions", :action=>"destroy"}            root /(.:format) {:controller=>"pages", :action=>"home"}

I'm at a complete loss. I can get to new and edit and when I submit the new post or submit the edit, i'll get:

Routing Error No route matches "/knodes/new"

Are you saying that you can get to new ok, so you are in the view new.html.erb, then when you click the save button you get the routing error above? that seems a bit odd as it should be going to create not new. Have you checked in log/development.log to see if there is any more info? It may be that it is going to the create and then failing at the next stage. Does it create the new record? If you are sure it is not going to create then post the view code please.

or

Routing Error No route matches "/knodes/1/edit"

Similarly this should be going to update not edit.

Colin

Thanks for the response! To clarify:

I can actually get to new.html.erb and :id/edit.html.erb. the problem is on submit i'll get those errors. it does not create or edit the post when i submit either. I have manually made 2 posts in mysql for testing purposes.

Here is the newest lines in my log/dev:

Started POST "/knodes/2/edit" for 72.1.183.251 at Thu Nov 25 13:35:41 -0800 2010

ActionController::RoutingError (No route matches "/knodes/2/edit"):

Rendered /home/bwoodall/.gem/ruby/1.8/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0ms)

Started GET "/knodes" for 72.1.183.251 at Thu Nov 25 13:38:35 -0800 2010   Processing by KnodesController#index as HTML   Knodes Load (0.2ms) SELECT `knodes`.* FROM `knodes` ORDER BY knodes.created_at DESC Rendered layouts/_stylesheets.html.erb (2.4ms)   User Load (0.2ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 1) LIMIT 1 Rendered layouts/_header.html.erb (41.5ms) Rendered layouts/_footer.html.erb (1.9ms) Rendered knodes/index.html.erb within layouts/application (73.0ms) Completed 200 OK in 98ms (Views: 78.5ms | ActiveRecord: 0.4ms)

Started GET "/knodes/new" for 72.1.183.251 at Thu Nov 25 13:38:37 -0800 2010   Processing by KnodesController#new as HTML   User Load (0.1ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 1) LIMIT 1 DEPRECATION WARNING: <% %> style block helpers are deprecated. Please use <%= %>. (called from _app_views_knodes__new_form_html_erb__707979935__617958448_1646016 at /home/bwoodall/rails/knode/app/views/knodes/_new_form.html.erb:1) Rendered knodes/_new_form.html.erb (12.7ms) Rendered layouts/_stylesheets.html.erb (1.9ms) Rendered layouts/_header.html.erb (4.8ms) Rendered layouts/_footer.html.erb (1.8ms) Rendered knodes/new.html.erb within layouts/application (29.6ms) Completed 200 OK in 77ms (Views: 33.9ms | ActiveRecord: 0.1ms)

Started POST "/knodes/new" for 72.1.183.251 at Thu Nov 25 13:38:46 -0800 2010

ActionController::RoutingError (No route matches "/knodes/new"):

Rendered /home/bwoodall/.gem/ruby/1.8/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.2ms)

Started POST "/knodes/new" for 72.1.183.251 at Thu Nov 25 13:43:03 -0800 2010

ActionController::RoutingError (No route matches "/knodes/new"):

Rendered /home/bwoodall/.gem/ruby/1.8/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.3ms)

It's because of this line in the _form.html.erb...isn't it...

<% form_for @knodes, :url => { :action => :edit } do |f| %>

the { :action => :edit } is keeping it on edit and not pushing it to update

i put that in there for edit and new because without it for new.html.erb, i keep getting:

This is incorrect - your form should be submitting to the update or create action depending on whether the object is saved or not. If you just do <% form_for @knodes do |f| %> rails will handle this for you

Fred

I am a bit confused about you naming for Knodes. In an earlier post you have   def new     @knodes = Knodes.new   end which suggests that your model is class Knodes, and you seem to be using knodes for both the singular and plural. Rails can get confused if you do not follow the conventions, though it is possible to work around this. I would have expected, though, to see model Knode in model/knode.rb, and controller KnodesController in controllers/knodes_controller.rb. Whether this is part of your problem I do not know.

Colin

Frederick Cheung wrote in post #964102:

Colin Law wrote in post #964106:

I not going to guarantee this is the problem (in fact I suspect it may not be), but if it isn't you will probably run into some problem with the names at some point if you don't fix it now. The less code there is the easier to change. In addition to the model name I would suggest also making the variable names consistent. So for example it would be better if it were @knode = Knode.new and @knodes = Knode.all Apart from anything else, when you are writing code you will always know that @knode is a single item and @knodes is a set.

Colin