已更新会话数据
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 !@contest.new_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设为nil
>> @current_user
=> nil
没有意义。我已登录,甚至将此特定用户设置为role = "admin" inside rails c.
答案 0 :(得分:0)
当您查看会话检查时,您可以在日志底部看到
{"session_id"=>"a24e285e4a535cec4d7c20908aa40ef9", "_csrf_token"=>"oBOzksAaS2KkkfgOkA1q2Wj32UuSpFtoMZuW78Rse8U=", "current_user_id"=>42, "access_token"=>"635d45b8319c0b94f09d99fe463e4d4add3a1f40b179ea9720bbbf0f896fa252"}
这意味着你的应用程序alread会保存current_user_id,所以我不知道你是否应该真正按访问令牌进行搜索。
尽管如此,两者都应该可以正常工作。
你的问题是你错误地使用了helper_method。使用此方法意味着rails将此方法“公开”到视图中,但是通过延迟评估。这意味着您应该通过方法名称访问它的实例变量,而不是通过instance_variable调用。尝试在视图中将@current_user更改为current_user。在你记忆的时候,无论如何它都会对数据库进行1次调用。