HomeController#index中的ActiveRecord :: RecordNotFound找不到具有'id'=的用户

时间:2019-09-06 20:43:14

标签: ruby-on-rails if-statement ruby-on-rails-5

错误:注销时。

我试图在登录“ admin”时使用_admin_user_header语句显示if部分:

摘自:_header部分。

<div class="collapse navbar-collapse d-flex justify-content-end">
  <% if(current_user && current_user.role == 'admin') %>      <== this 
    <%= render partial: 'admin_user_header' %>                <== 2 lines 
  <% elsif(logged_in?) %>
    <%= render partial: 'registered_user_header' %>
  <% else %>
    <%= render partial: 'anonymous_user_header' %>
  <% end %>
</div>

执行<% if(current_user && current_user.role == 'admin') %>显然可行,但是当我尝试从current_user帐户注销时,出现此错误:

ActiveRecord::RecordNotFound in HomeController#index

Couldn't find User with 'id'=
Extracted source (around line #25):

23      end
24
25      @current_user = User.find(session[:user_id])
26   end
27
28   def ensure_authenticated

Rails.root: 
/Users/dangerrg/Documents/....

Application Trace | Framework Trace | Full Trace
app/controllers/application_controller.rb:25:in `current_user'
app/views/application/_header.html.erb:8:in `_app_views_application__header_html_erb__900908384298268245_70228604326660'
app/views/layouts/application.html.erb:12:in `_app_views_layouts_application_html_erb___299989914533477205_70228570235680'

我已经检查了其他帖子中的类似问题,寻找解决方案,并且尝试了不同的方法来完成此操作,但还没有成功。

我还在Rails控制台中检查了我的数据库,所有用户都有和:id,并为其分配了各自的值。

application_controller.rb

...

 helper_method :logged_in?, :current_user

 def logged_in?
   session[:user_id].present?
 end

...

 def current_user
   if(@current_user.present?)
     return @current_user
   end

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

...

home_controler.rb 中,这是唯一的方法:

 def index
   @tips = Tip.most_recent
 end

在此方面,我将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:0)

current_user仅在用户登录时有效。注销后,它将清除会话[:user_id]。这就是为什么您找不到用户的原因。

User.find(nil)

在调用查询数据库的当前用户方法之前,请尝试检查存在的会话[:user_id]。那会起作用:

if(logged_in? && current_user && current_user.role == 'admin')

def current_user
  return unless logged_id?

  if(@current_user.present?)
    return @current_user
  end

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

我认为最好的选择是将渲染包装在if(logged_in?)语句中:

<div class="collapse navbar-collapse d-flex justify-content-end">
  <% if(logged_in?) %>
    <% if(current_user && current_user.role == 'admin') %>      
      <%= render partial: 'admin_user_header' %>                
    <% else %>
      <%= render partial: 'registered_user_header' %>
    <% end %>
  <% else %>
    <%= render partial: 'anonymous_user_header' %>
  <% end %>
</div>