2016-03-24 4 views
1

Я использую devise_ldap и devise_ldap для проверки своих рельсов. Я пытаюсь использовать встроенный помощник, текущий пользователь для отображения электронной почты пользователей на странице приветствия моего приложения. Это код, который я пытался использовать для:Не удается получить доступ к «текущему пользователю» в рельсах

<% if user_signed_in? %> 
<div>Signed in as... <%= current_user.email %></div> 
<% end %> 

при входе в приложение, я получаю сообщение об ошибке;

undefined method `email' for nil:NilClass 

Вот мой routes.rb

Rails.application.routes.draw do 

devise_for :users 
resources :users 
resources :systems do 
    member do 
    get :targets, :sources 
end 
root  'systems#index' 
end 

и мой контроллер пользователей:

class UsersController < ApplicationController 
authorize_resource 
before_action :set_user, only: [:show, :edit, :update, :destroy] 

# GET /users 
def index 
@users = User.all.order("display_name asc") 
end 

# GET /users/1 
def show 
end 

# GET /users/new 
def new 
    @user = User.new 
end 

# GET /stories/1/edit 
def edit 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

# POST /stories 
def create 
@user = User.new(user_params) 
    respond_to do |format| 
     puts 'user controller' 
     if @user.save! 
     format.html { redirect_to user_path(@user), notice: 'User was successfully created.' } 
     else 
     format.html { render :new } 
     end 
    end 
end 

# PATCH/PUT /stories/1 
def update 
    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to user_path(@user), notice: 'User was successfully updated.' } 
     else 
     format.html { render :edit } 
     end 
    end 
end 

# DELETE /stories/1 
def destroy 
@user.destroy 
respond_to do |format| 
    format.html { redirect_to users_path notice: 'User was successfully destroyed.' } 
end 
end 

private 
# Use callbacks to share common setup or constraints between actions. 
def set_user 
    @user = User.find(params[:id]) 
end 



# Never trust parameters from the scary internet, only allow the white list through. 
def user_params 
    params.require(:user).permit(:display_name, :email, :username) 
end 
end 

мои пользователи модели:

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
before_create :rememberable_value 

before_save :get_ldap_values 

devise :ldap_authenticatable, :rememberable, :trackable, :validatable 

def get_ldap_values 
    if self.username 
    self.email = Devise::LDAP::Adapter.get_ldap_param(self.username,"mail").first if Devise::LDAP::Adapter.get_ldap_param(self.username,"mail") 
    self.display_name = Devise::LDAP::Adapter.get_ldap_param(self.username,"displayName").first if Devise::LDAP::Adapter.get_ldap_param(self.username,"displayName") 
    end 
end 

# def role?(role) 
#  return !!self.roles.find_by_name(role.to_s.camelize) 
# end 

def email_required? 
    false 
end 

def email_changed? 
    false 
end 
def rememberable_value 
    self.remember_token ||= Devise.friendly_token 
end 

def name_to_display 
    if self.display_name 
     self.display_name 
    else 
     self.username 
    end 
end 

def password_required? 
    false 
end 

def password_match? 
    self.errors[:password] << "can't be blank" if password.blank? 
    self.errors[:password_confirmation] << "can't be blank" if password_confirmation.blank? 
    self.errors[:password_confirmation] << "does not match password" if password != password_confirmation 
    password == password_confirmation && !password.blank? 
end 
end 

Я не уверен, что я отсутствует, чтобы иметь доступ к текущей информации о пользователях a осле успешный вход

Update

Вот новый файл маршрутов:.

Rails.application.routes.draw do 


devise_scope :user do 
get '/users/sign_out' => 'devise/sessions#destroy' 
get "https://stackoverflow.com/users/sign_in" => "devise/sessions#new" 
# delete "/logout" => "devise/sessions#destroy" 
end 

devise_for :users 
authenticate(:user) do 
resources :users 
resources :reports 
resources :change_logs, only: [:index, :show] 
resources :systems do 
    member do 
    get :targets, :sources 
    end 
    resources :change_logs, module: :systems 
    resources :components do 
    resources :change_logs, module: :components 
    end 
    resources :c_relations 
end 

resources :integrations 
    get '/static_pages/home' # => 'static_pages#home', as: 'home' 
root  'systems#index' 
end 
+0

- это метод «user_signed_in?» Или вы его написали? Если это первый, вы можете предоставить его тело? –

+0

- метод разработки; Чтобы проверить, был ли пользователь подписан, используйте следующий помощник: user_signed_in? – saltlife31496

+1

Исходя из исходного кода, кажется, что user_signed_in? метод динамически определяется как '{mapping} _signed_in?'. Вы случайно пересилили (это слово?) Опцию 'devise_mapping' в вашем приложении application_helper? (... или ответ @Matt) –

ответ

1

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

0

У вас есть before_action :authenticate_user!in your controller цепь вообще?

Current_user может быть равен нулю после того, как вы не укажете, чтобы выполнить проверку подлинности.

+0

У меня это в контроллерах приложений – saltlife31496

1

В routes.rb вы должны заключить строки следующие

devise_for :users 

в блоке

authenticate(:user) do 
    resources :users 
    [...] 
end 
+0

все ли мои ресурсы идут в этом блоке или просто у пользователей? – saltlife31496

+0

Все те, для которых вы хотите аутентифицировать пользователя.Нет аутентификации, нет current_user. – GabrieleF

+0

см. Мое обновление для файла маршрутов. Я все еще получаю ошибку; 'undefined email метода для nil: NilClass' – saltlife31496

Смежные вопросы