0

使用会话数据更新

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 为零

>> @current_user
=> nil

这是没有意义的。我已登录,甚至将此特定用户设置为role = "admin" inside rails c.

4

1 回答 1

0

当您查看会话检查时,您可以在日志底部看到

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

这意味着您的应用程序已经保存了 current_user_id,所以我不知道您是否真的应该通过访问令牌进行搜索。

不过,两者都应该可以正常工作。

您的问题是您错误地使用了 helper_method。使用这个方法意味着 rails 把这个方法“暴露”给视图,但是通过惰性求值。这意味着您应该通过方法名称访问它的实例变量,而不是通过 instance_variable 调用。尝试在视图中将 @current_user 更改为 current_user。当您正在记忆它时,它无论如何都会对数据库进行 1 次调用。

于 2014-09-19T09:46:29.187 回答