简体   繁体   中英

Rails 4: Sessions - undefined method `current_user'

I am following along this tutorial's authentication process:

http://larsgebhardt.de/user-authentication-with-ruby-on-rails-rspec-and-capybara/

Since the tutorial is based off Rails 3, according to the last commenter in the article above, there are only a few modifications needed to make the tutorial compatible with Rails 4. I made those changes but still continue to chase my tail with issues. I have posted questions 2 other times on Stack Overflow and although I'm getting answers that 'fix' the current issue at hand, I'm afraid I might be straying away from the tutorial's approach of authentication from scratch - further breaking the tests which is causing a domino effect of issues.

For a bit of history, here is the last two questions in chronological order..

So here's the failure I have now..

  5) User Management User log out
     Failure/Error: activate(@writer)
     ActionView::Template::Error:
       undefined method `current_user' for #<SessionsController:0x007fd2029c8d68>

users_spec.rb ..

feature 'User Management' do

    background do
      @writer = create(:user, :writer)
    end

scenario 'User log out' do
  activate(@writer)
  login(@writer)
  logout(@writer)
  expect(page).to have_content "Successfully logged out."
end

The method exists in my profiles_controller.rb - which is similar to the tutorial's offices_controller.rb

class ProfilesController < ApplicationController


  def show
    auth_required
    access_only_with_roles("writer", "admin")
  end

  def current_user
    @current_user ||=  User.find(session[:user_id]) if session[:user_id]
  end
end

This is the _header.html.erb file with the Log Out link code.

    <a href="#"><%= link_to "Sign Up", new_user_path %></a>
    <a href="#"><%= link_to "Log In", new_session_path %></a>
    <a href="#"><%= link_to "Log Out", session_path(current_user), method: :delete %></a>

My routes.rb ..

Rails.application.routes.draw do
  get 'profiles/show'

  get 'sessions/new'

  get 'users/new'

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
 root 'sessions#new'

  resources :posts do
    resources :comments
end


  resources :sessions
  resources :users
  resources :profile

  get "activate/:code" => "users#activate", :as => "activate"

..and rake routes

    Prefix Verb   URI Pattern                                 Controller#Action
    profiles_show GET    /profiles/show(.:format)                    profiles#show
     sessions_new GET    /sessions/new(.:format)                     sessions#new
        users_new GET    /users/new(.:format)                        users#new
             root GET    /                                           sessions#new
    post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                  POST   /posts/:post_id/comments(.:format)          comments#create
 new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
     post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                  PATCH  /posts/:post_id/comments/:id(.:format)      comments#update
                  PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                  DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
            posts GET    /posts(.:format)                            posts#index
                  POST   /posts(.:format)                            posts#create
         new_post GET    /posts/new(.:format)                        posts#new
        edit_post GET    /posts/:id/edit(.:format)                   posts#edit
             post GET    /posts/:id(.:format)                        posts#show
                  PATCH  /posts/:id(.:format)                        posts#update
                  PUT    /posts/:id(.:format)                        posts#update
                  DELETE /posts/:id(.:format)                        posts#destroy
         sessions GET    /sessions(.:format)                         sessions#index
                  POST   /sessions(.:format)                         sessions#create
      new_session GET    /sessions/new(.:format)                     sessions#new
     edit_session GET    /sessions/:id/edit(.:format)                sessions#edit
          session GET    /sessions/:id(.:format)                     sessions#show
                  PATCH  /sessions/:id(.:format)                     sessions#update
                  PUT    /sessions/:id(.:format)                     sessions#update
                  DELETE /sessions/:id(.:format)                     sessions#destroy
            users GET    /users(.:format)                            users#index
                  POST   /users(.:format)                            users#create
         new_user GET    /users/new(.:format)                        users#new
        edit_user GET    /users/:id/edit(.:format)                   users#edit
             user GET    /users/:id(.:format)                        users#show
                  PATCH  /users/:id(.:format)                        users#update
                  PUT    /users/:id(.:format)                        users#update
                  DELETE /users/:id(.:format)                        users#destroy
    profile_index GET    /profile(.:format)                          profile#index
                  POST   /profile(.:format)                          profile#create
      new_profile GET    /profile/new(.:format)                      profile#new
     edit_profile GET    /profile/:id/edit(.:format)                 profile#edit
          profile GET    /profile/:id(.:format)                      profile#show
                  PATCH  /profile/:id(.:format)                      profile#update
                  PUT    /profile/:id(.:format)                      profile#update
                  DELETE /profile/:id(.:format)                      profile#destroy
         activate GET    /activate/:code(.:format)                   users#activate

I would love to figure this out once and for all. It appeared to be a great tutorial. If I figure out the changes then I plan to post them in the comment section of the article for anyone else who plans to use it.

You are getting undefined method current_user' because you defined current_user in the profilesController ,` so it won't be accessible to the view in which you are using it. The solution is to move this method to the applicationController like this :

class ApplicationController < ActionController::Base

  protect_from_forgery

  helper_method :current_user

  private
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

So now you can use current_user in any view folder. I just checked the tutorial and it tells you to add this method to applicationController, so you probably added it to profilesController by mistake.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM