Scro
Scro

Reputation: 1443

Rails Routes not conforming to expected controller action

I've spent several hours trying to understand why my Rails 4 app doesn't seem to want to route to the expected controller action.

In summary: every single action that I attempt in the browser URL seems to go to the index view, even though my routes appear to be correct. I've attempted to restart the server, etc hoping that might fix it, but right now I'm completely lost.

For example, if I try to access the URL at localhost:3000/leads#new I get the following error message:

Missing template leads/index, application/index with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "/Users/me/Sites/azimuth/app/views"

If I add a template for index.html.erb to the app/views/leads folder, then I don't get the error message - however every single path goes to that same index view - leads#show, leads#edit, etc - all of them.

Here is the routes.rb:

Azimuth::Application.routes.draw do

  # get 'leads', to: 'leads#new'

  resources :applicants
  resources :contacts
  resources :leads

  PagesController.action_methods.each do |action|
    get "/#{action}", to: "pages##{action}", as: "#{action}_page"
  end

  root "pages#home"
end

note that the commented line - get 'leads', to: 'leads#new' - seems to be the only way to properly get the routing to work. Using resources :leads (which I understand is best practice?) is giving me fits.

Here's the leads_controller.rb:

class LeadsController < ApplicationController
  def new
    @lead = Lead.new
  end

  def create
    @lead = Lead.new(lead_params)
    if @lead.save
        flash[:success] = "Thank you for reaching out! We'll be in touch soon."
        redirect_to 'home'
    else
        render 'new'
    end
  end

  def index
    @lead = Lead.all
  end

  private

    def lead_params
        params.require(:lead).permit(:first_name, :last_name, :subject, :message)
    end
end

Rake routes - appears that things should work fine. (Note this is just showing the routes relevant to the Leads object).

        Prefix Verb   URI Pattern                    Controller#Action
         leads GET    /leads(.:format)               leads#index
               POST   /leads(.:format)               leads#create
      new_lead GET    /leads/new(.:format)           leads#new
     edit_lead GET    /leads/:id/edit(.:format)      leads#edit
          lead GET    /leads/:id(.:format)           leads#show
               PATCH  /leads/:id(.:format)           leads#update
               PUT    /leads/:id(.:format)           leads#update
               DELETE /leads/:id(.:format)           leads#destroy

I'm very confused, can't seem to track down what's going on, and would appreciate any help!

Upvotes: 0

Views: 125

Answers (1)

Graeme Britz
Graeme Britz

Reputation: 36

Correct me if you are wrong, but I think you are trying to access the wrong URL. You said you were visiting localhost:3000/leads#new in your browser. The correct URL for that route would be localhost:3000/leads/new

When are you are defining routes in your config/routes.rb file, the #'s are used to let rails know that you are specifying that a method of one of your controllers should respond to this URL. The actual URL's do not contain #'s (typically speaking).

Upvotes: 1

Related Questions