2015-03-24 6 views
0

Я следую по процессу аутентификации данного руководства заключается в:Rails 4: Сессии - неопределенный метод `current_user»

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

Поскольку учебник базируется на Rails 3, в соответствии с последним комментатора в статье выше, есть только несколько модификаций, необходимых для того, чтобы учебник совместим с Rails 4. Я сделал эти изменения, но по-прежнему продолжаю преследовать свой хвост с проблемами. Я еще два раза писал вопросы о переполнении стека, и хотя я получаю ответы, которые «исправляют» текущую проблему под рукой, я боюсь, что могу отклониться от подхода к аутентификации с нуля - дальнейшее нарушение тестов, которые вызывает эффект домино вопросов.

Для немного истории, вот последние два вопроса в хронологическом порядке ..

Так вот неудача у меня сейчас ..

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

users_spec. гь ..

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 

Метод существует в моем profiles_controller.rb - который похож на учебник-х 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 

Это _header.html.erb файл с кодом выхода из системы.

<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> 

Мой 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" 

..и рейк маршруты

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 

Я хотел бы, чтобы понять это раз и навсегда. Похоже, это отличный учебник. Если я выясню изменения, я планирую опубликовать их в разделе комментариев статьи для всех, кто планирует ее использовать.

+0

Я только что добавил свой ответ. И, как правило, переходы с рельсов с 3 по 4 имеют некоторую боль, поэтому вы привыкнете к ней. Вы на правильном пути. –

ответ

2

Вы получаете undefined method current_user ', потому что вы определили current_user в profilesController, поэтому он не будет доступен для просмотра, в котором вы его используете. Решение состоит в том, чтобы переместить этот метод к ApplicationController так:

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 

Итак, теперь вы можете использовать CURRENT_USER в любой папке просмотра. Я только что проверил учебник, и он говорит вам добавить этот метод в applicationController, поэтому вы, вероятно, добавили его в profilesController по ошибке.

+0

Не могу поверить, что я поскользнулся. Спасибо вам за помощь! – shroy