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

ヒットするURL/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.

4

1 に答える 1

0

セッション検査を見ると、ログの下部に表示されます

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

これは、アプリケーションが既に current_user_id を保存していることを意味するため、本当にアクセス トークンで検索する必要があるかどうかはわかりません。

それでも、どちらも正常に動作するはずです。

あなたの問題は、helper_method を間違って使用していることです。このメソッドを使用するということは、レールがこのメソッドをビューに「公開」することを意味しますが、遅延評価によって行われます。これは、instance_variable 呼び出しではなく、メソッド名でそのインスタンス変数にアクセスする必要があることを意味します。ビューで @current_user を current_user に変更してみてください。メモ化しているので、とにかくデータベースへの呼び出しが1回行われます。

于 2014-09-19T09:46:29.187 に答える