当我尝试登录时,我会得到:
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
猜测它不是绝对权利,而是可能的方法之一