1
votes

I have Rails 4.0.10. I'm following Michael Hartl's Ruby on Rails tutorial, and I'm trying to build a login function, but I'm getting the following error when I press the login button:

Routing Error
uninitialized constant SessionController

I followed the instructions exactly, so I'm confused about why I'm getting an error. What did I do wrong?

My Sessions Controller:

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(id: params[session][:id])
    if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to root_path
    else
      flash.now[:danger] = 'Invalid'
      render 'new'
    end
  end

  def destroy
  end
end

Routes:

Website::Application.routes.draw do

  get 'login' => 'sessions#new'
  post 'login' => 'session#create'
  delete 'logout' => 'sessions#destroy'
  get "users/new"
  root 'home_page#home'

end

Sessions/new View:

<div id= "admin-sign-in">
  <%= form_for(:session, url: login_path) do |f| %>

    <%= f.label :id %>
    <%= f.text_field :id %>

    <%= f.label :password %>
    <%= f.password_field :password %>

    <%= f.submit "Log in", class: "btn btn-primary" %>
  <% end %>
</div>

Sessions Helper:

module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end
end

User Model:

class User < ActiveRecord::Base
  has_secure_password
end

Users Controller:

class UsersController < ApplicationController

  def new
    @user = User.new
    @users = User.all
  end

  def create
    @user = User.new(user_params)
    if @user.save
      render :action => "crop"
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:password, :password_confirmation)
    end

end

ApplicationController:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end
1

1 Answers

10
votes

Instead of:

post 'login' => 'session#create'

Use the plural:

post 'login' => 'sessions#create'