Rails - undefined 方法 'admin' for nil:NilClass in Sessions#create



当我尝试登录时,我会得到:

undefined method `admin' for nil:NilClass

layouts/_head.html.erb partial

称为

_head.html.erb:

<% if session[:user_id] %>
  <% if @current_user.admin %>
    <%= button_to 'Swap to user', to_user_path(User.find_by(id: session[:user_id]).id), method: :put,
                    class: 'btn btn-warning' %>
  <% else %>
    <%= button_to 'Swap to admin', to_admin_path(User.find_by(id: session[:user_id]).id), method: :put,
                    class: 'btn btn-warning' %>
  <% end %>
<% end %>

如您所见,session[:user_id]存在。这是application_controller.rb:

class ApplicationController < ActionController::Base
  before_action :set_user
  protect_from_forgery with: :exception
  def set_user
    if session[:user_id]
      @current_user = User.find_by(session[:user_id])
    end
  end
end 

还可以通过Ajax进行登录按钮。那么,如果在应用程序控制器中定义了before_action,为什么我将@current_user作为CC_3呢?(记住:session[:user_id] != nil

您对find_by的使用不正确。应该是:

@current_user = User.find_by(:id => session[:user_id])

,因此求解是在创建方法中定义@current_user,例如

def create
user = User.find_by(name: params[:name])
  respond_to do |format|
    if user and user.authenticate(params[:password])
       session[:user_id] = user.id
       @current_user = user
       format.js { }
    else
       format.js {flash.now[:notice] = 'Wrong pass/name'}
    end
  end
end

猜测它不是绝对权利,而是可能的方法之一

最新更新