views:

284

answers:

2

I am working on a project in ruby on rails and I am having a very difficult time with a basic problem. I am trying to call a custom action in one of my controllers, but the request is somehow getting redirected to the default 'show' action and I cannot figure out why.

link in edit.html.erb:

<%= link_to 'Mass Text Entry', :action=>"create_or_add_food_item_from_text" %>

Error from development.log:

ActiveRecord::RecordNotFound (Couldn't find Menu with ID=create_or_add_food_item_from_text): app/controllers/menus_controller.rb:20:in `show'

routes.rb file:

ActionController::Routing::Routes.draw do |map|
map.resources :nutrition_objects
map.resources :preference_objects
map.resources :institutions
map.resources :locations
map.resources :menus
map.resources :food_items
map.resources :napkins
map.resources :users
map.resource  :session, :controller => 'session'

map.root :controller=>'pages', :action=>'index'

map.about  '/about',  :controller=>'pages', :action=>'about'
map.contact '/contact', :controller=>'pages', :action=>'contact'
map.home   '/home',    :controller=>'pages', :action=>'index'

map.user_home   '/user/home',   :controller=>'rater', :action=>'index'
map.user_napkins   '/user/napkins', :controller=>'rater', :action=>'view_napkins'
map.user_preferences  '/user/preferences',:controller=>'rater', :action=>'preferences'

map.blog   '/blog', :controller=>'pages', :action=>'blog'
map.signup  '/signup',  :controller=>'users',  :action=>'new'
map.login  '/login',  :controller=>'session', :action=>'new'
map.logout  '/logout',  :controller=>'session', :action=>'destroy'

# Install the default routes as the lowest priority. 
map.connect ':controller/:action'
map.connect ':controller/:action/:id' 
map.connect ':controller/:action/:id.:format'
end

Menus_controller.rb:

class MenusController < ApplicationController
...
   def create_or_add_food_item_from_text  
   end
...
end

create_or_add_food_item_from_text.html.erb simply has a div to show a form with a text box in it. I have the rest of my app working fine, but this is stumping me.

Any help is appreciated.

A: 

link_to expects the path to your action as the second parameter - it looks like you are passing link_to the wrong path value. Check the development log to see what path rails thinks you are looking for.

Toby Hede
The rails documentation has link_to(name, options = {}, html_options = nil), so I am pretty sure that I set up the link correctly
conorgil
+2  A: 

Try adding the route to your file explicitly, before the :menus resources:

map.connect "/menus/create_or_add_food_item_from_text",
  :controller => "menus", :action => "create_or_add_food_item_from_text"

map.resources ...

Routes declared earlier have higher priority, and the problem here is that map.resources actually prevents certain paths from being routed.

Even regardless of this issue, it's good practice to map all paths explicitly, either through resources or named/unnamed routes, and ultimately eliminate the generic :controller/:action and :controller/:action/:id routes from your app.

Alex Reisner
I rearranged my routes.rb file and declared the route explicitly before the :menus resources like you suggested. It worked out fine. Thanks for the quick suggestion
conorgil