0

Environment:

  • Rails 3.2.3
  • Mac OS X Lion
  • Ruby-1.9.3-p194 (MRI)

I have a rails app and I am using app/views/layouts/application.html.erb as a sort of 'left-nav-pane' for some links I use as menu options.

There are two links using link_to in the menu (reduced for brevity here). If I REMOVE one link and run the app, the remaining link does what it's supposed to do. If I REMOVE the second link and RESTORE the first link, the first link does what IT is supposed to do.

If, however, I have both links in the menu at the same time, clicking one of them will work, but clicking the second creates a runtime error.

Using Pry and the Rails source itself (3.2.3), I have pin-pointed where the error is occurring in the framework. The exception happens in actionpack-3.2.3/lib/action_view/template.rb and is happening in the render method on the following line of code:

def render(view, locals, buffer=nil, &block)
  ActiveSupport::Notifications.instrument("!render_template.action_view", :virtual_path => @virtual_path) do
    compile!(view)
    view.send(method_name, locals, buffer, &block)   # <----ERROR OCCURS HERE
  end
rescue Exception => e
  handle_render_error(view, e)
end

The value of method_name = _app_views_layouts_application_html_erb___1387085669206687706_70334317584180

There is a method by this name on the view. When the 'send' is executed, the following exception is generated.

ActionController::RoutingError: No route matches {:action=>"signup_for_role",       
:controller=>"assignments", :club_id=>nil, :member_id=>[#<Member id: 2, first_name: 
"Joseph", last_name: "Smith", start_date: "2012-01-01", end_date: "9999-12-31", 
created_at: "2012-04-07 13:58:46", updated_at: "2012-05-06 21:54:12", club_id: 2, email:    
"joe.smith@gmail.com", assignable: true, address_one: nil, address_two: nil, city: nil, 
state: nil, zip_code: nil, phone: nil, mobile_phone: nil>]}

Because the code in the method is generated by Rails and not in a source code file, I am unable to step through it with Pry; I can only 'send' the message and see the result.

Here's the code from the layout with the two links in question:

<!DOCTYPE html>
<html>
  <head>
    <title>MyApp</title>
    <%= stylesheet_link_tag    "application" %>
    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <div style='padding-left:10px;  margin-top:10px; ' >
      <div class='container' style='margin-top:50px; margin-left:50px;padding-right:200px; '>

        <!-- This link_to works, whether alone, or when the other link_to is present -->
        <%=  link_to "Sign Up for a Role", signup_for_role_club_member_assignments_path(params[:club_id], current_user_as_member) %>  
        <br/><br/>

        <!-- This link_to fails when both link_to's are present, but works when the other link_to is removed. -->
        <%= link_to "Clubs", clubs_path %><br>


      </div>
      <!-- ***************************************************************** -->
      <!-- Yield below... this is where the currently selected view displays -->
      <!-- ***************************************************************** -->
      <div class='container' style='margin-left:200px'  >
        <%= yield %>
      </div>
    </div>
  </body>
</html>

Lastly, here is my routes.rb file:

Rolemaster::Application.routes.draw do

  resources :sessions
  resources :enrollments
  resources :logs

  resources :clubs do
    resources :members do
      resources :assignments do
        collection do
          get 'signup_for_role'
          get 'display_success'
          get 'past_activity'
        end
      end
      resources :absences 
    end
    resources :roles 
    resources :role_groups  

    resources :meetings do
      get 'forassignment', :on => :collection
      get 'print'
      resources :assignments
    end

    resources :assignments do
      post 'generate', :on => :collection 
    end
    resources :absences do
      get 'list', :on => :collection
    end
  end  


  resources :users do
    put "update_password" => "users#update_password"
    put "update_email" => "users#update_email"
    get "edit_password" => "users#edit_password"
    get "edit_email"    => "users#edit_email"
  end

  match "agendas/print"  
  get "enrollments/new"
  post "enrollments/create"
  get "log_in" => "sessions#new", :as => "log_in"
  get "log_out" => "sessions#destroy", :as => "log_out"
  get "sign_up" => 'users#new', :as => 'sign_up'
  get "test/email"
  get "sessions/revoke_admin"
  get "sessions/revoke_super_user"


  get "admins" => "admins#index"
  root :to => 'sessions#new'
end

Any help is greatly appreciated. I've probably spent 20 hours or more on this so far.

MotownJoe
  • 78
  • 5
  • but u have error with first link...club_id nil and member_id is array – Yuri Barbashov May 23 '12 at 10:44
  • Yuri... the first link works find and as designed. current_user_as_member is a method in my ApplicationController that returns the correct value for the logged in user. So, that link works find. It's the (should be) super-simple Clubs one that does not work. – MotownJoe May 23 '12 at 12:55
  • Also, I should mention, the ROUTING for these two links does work. They get to the correct action in the correct controller. It's the rendering of the view where the problem occurs. – MotownJoe May 23 '12 at 14:14
  • replace params[:club_id] with 2 and show me the error – Yuri Barbashov May 23 '12 at 14:49
  • Yuri, I won't be able to try this out until later today, but I think I see what you're saying. Let me see if I can phrase this correctly: If there are ANY links in a layout, clicking on ANY of them will render the target IN the layout. Thus, ALL links in the layout can CAN reference params that would be be present when ANY of the links in the layout are clicked and control transferred to that target page. Or...if you specified a different layout to use for that target, one which does not have those other links. Does that sound correct? I'll confirm with a test as you requested. – MotownJoe May 23 '12 at 16:04
  • 1
    Yuri, you are correct, sir! I am very new to stackoverflow, so please don't hesitate to contact me if I don't update or close out this question in away that confers upon you all the "reputations" or "points" that you deserve for answering my question. – MotownJoe May 23 '12 at 22:36
  • Actually, do you need to post your comment as an 'answer' so I can accept that answer as correct? – MotownJoe May 23 '12 at 22:37
  • u don't have enouth rep so u can't vote up, but u can accept answer. np. – Yuri Barbashov May 23 '12 at 22:44

1 Answers1

0

Always read error messages the truth is out there)

params[:club_id] is nil
Yuri Barbashov
  • 5,407
  • 1
  • 24
  • 20