I have two issues and can’t figure out why! I have followed the tutorial of http://ruby.railstutorial.org/chapters/
Problem #1: My login and logout don't seem to be working
Problem #2: My private function doesn't see sign_in? -- I believe however is because sign_in? is declared in the sessionHelpers and I declared this function in the customerController which would explain why I can't see but don't know how to make it see.
Here the code I have!
model/customer.rb
controller/sessions
class SessionsController < ApplicationController
def new
end
def create
customer = Customer.find_by_email(params[:session][:email])
if customer && customer.authenticate(params[:session][:password])
# Sign the user in and redirect to the user's show page.
sign_in customer
redirect_back_or customer
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
sign_out
redirect_to root_path
end
end
controller/customers
class CustomersController < ApplicationController
before_filter :signed_in_customer, only: [:edit, :update]
before_filter :correct_customer, only: [:edit, :update]
def new
@customer = Customer.new
end
def create
@customer = Customer.new(params[:customer])
if @customer.save
sign_in @customer
flash[:success] = "Welcome to Where you Where"
redirect_to @customer
else
render 'new'
end
end
def show
@customer = Customer.find(params[:id])
end
def edit
@customer = Customer.find(params[:id])
end
def update
@customer = Customer.find(params[:id])
if @customer.update_attributes(params[:customer])
flash[:success] = "Profile updated"
sign_in @customer
redirect_to @customer
else
render 'edit'
end
end
def index
@customers = Customer.all
end
private
def signed_in_customer
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
end
def correct_customer
@customer = Customer.find(params[:id])
redirect_to(root_path) unless current_customer?(@customer)
end
end
helpers/sessions
module SessionsHelper
def sign_in(customer)
cookies.permanent[:remember_token] = customer.remember_token
self.current_customer = customer
end
def sign_in?
!current_customer.nil?
end
def current_customer=(customer)
@current_customer = customer
end
def current_customer?(customer)
customer = current_customer
end
def current_customer
@current_customer ||= Customer.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_customer = nil
cookies.delete(:remember_me)
end
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.fullpath
end
end
Thanks again, sorry for the misspell
Update:
Application Controller
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :pages
def pages
@pages = Page.all
end
include SessionsHelper
end
Here the error when trying to edit the customer
undefined method `signed_in?' for #<CustomersController:0xb56089ec>
app/controllers/customers_controller.rb:45:in `signed_in_customer'
NOTE:: I just did db:reset and created a new account. I was successfull but the link in the header are shown has i am logout.
Here the header file
<header class="header">
<div class="menu">
<div class="center">
<div class="logo">
<nav>
<ul>
<% if sign_in? %>
<div>Welcome <%= current_customer.full_name %> </div>
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Customers", customers_path %></li>
<li><%= link_to "Profile", current_customer %></li>
<li><%= link_to "Settings", edit_customer_path(current_customer) %></li>
<li><%= link_to "Sign out", signout_path, method: "delete" %></li>
<% else %>
<li><%= link_to "Home", '#' %></li>
<li><%= link_to "Sign in", '#' %></li>
<% end %>
</ul>
</nav>
</div>
</div>
</div>
</header>
Make sure you include the helper in ApplicationController
This means any controllers that inherit from ApplicationController (such as CustomersController) in your example will be able to access the methods in your helper
I haven’t looked through all your code but let me know if this solves both your problems, if not let me know and I’ll have a longer look