2014-09-18 52 views
0

已更新,会话数据CURRENT_USER零值

pastebin.com/nGGriw7e


我有一个竞赛控制器,其从应用控制器继承

我们使用守门人的宝石。

在应用控制器

我们的CURRENT_USER定义,并设置为一个辅助方法

helper_method :current_user, :require_user, :require_no_user 

    def current_user 
    @current_user ||= current_user_session && User.find(current_user_session.resource_owner_id) 
    end 

    private 

    def current_user_session 
    @current_user_session ||= Doorkeeper::AccessToken.find_by_token session[:access_token] 
    end 

我打网址/contests这伤害contest#edit controller

def edit 
    @contest = Contest.find params[:id] 
    end 

这edit.html.erb我里面在呈现编辑素材之前部分地渲染侧导航

<div class="col-md-2"> 
    <ul class="left-nav"> 
    <% if @current_user.admin? or (@current_user.brand_admin? and @current_user == @contest.user) %> 
     <% if @current_user.admin? %><li><%= link_to 'New Contest', new_contest_path %></li><% end %> 
     <% if @contest and [email protected]_record? %> 
     <li><%= link_to 'Edit Contest', edit_contest_path(@contest) %></li> 
     <li><%= link_to 'All Contests', contests_path %></li> 
     <% end %> 
    <% end %> 
    </ul> 
</div 

这里是服务器日志

Started GET "/contests/5/edit" for 127.0.0.1 at 2014-09-18 17:29:14 -0400 
Processing by ContestsController#edit as HTML 
    Parameters: {"id"=>"5"} 
    Contest Load (0.4ms) SELECT `contests`.* FROM `contests` WHERE `contests`.`id` = 5 LIMIT 1 
    Rendered contests/_side_nav.html.erb (2.0ms) 
    Rendered contests/edit.html.erb within layouts/application (2.8ms) 
Completed 500 Internal Server Error in 7ms 

NoMethodError - undefined method `admin?' for nil:NilClass: 
更好的错误

我收到@current_user是零

>> @current_user 
=> nil 

这没有任何意义。我登录,甚至设立了这个特殊的用户具有role = "admin" inside rails c.

+0

你有什么会议?你可以在控制器操作中记录它吗? (把session.inspect) – konole 2014-09-18 21:36:09

+0

这里是我的,我不明白。 http://pastebin.com/nGGriw7e – Jngai1297 2014-09-18 21:48:48

回答

0

当你看看会话检查,对日志的底部,你可以看到

{"session_id"=>"a24e285e4a535cec4d7c20908aa40ef9", "_csrf_token"=>"oBOzksAaS2KkkfgOkA1q2Wj32UuSpFtoMZuW78Rse8U=", "current_user_id"=>42, "access_token"=>"635d45b8319c0b94f09d99fe463e4d4add3a1f40b179ea9720bbbf0f896fa252"} 

这意味着你的应用程序alread保存current_user_id,所以我不知道你是否应该通过访问令牌来搜索。

尽管如此,两者都应该正常工作。

你的问题是你错误地使用了helper_method。使用这种方法意味着钢轨“暴露”这种方法的观点,但通过懒惰评估。这意味着你应该通过方法名来访问它的实例变量,而不是通过instance_variable调用。尝试在视图中将@current_user更改为current_user。正如你在记忆它,它会打电话给数据库无论如何。