2016-05-07 28 views
2

私は、ユーザーが特定のクイズを完了したかどうかに基づいて多くの変更を行うレールアプリを構築しています。ユーザーがログインしているとき、すべてが正常に動作しますが、私はちょうどログアウトしようと、私はこのコード行にNoMethodErrorを得た:ログアウト時に現在のユーザーのモデルにRubyメソッドのエラーがありません

基本的に
<% if current_user.per_quiz.nil? %> 

、ユーザーがper_quizを完了した場合、彼らは1ページに移動(edit他のページ(newビュー)に移動していない場合は表示されます。変更された唯一の事は私がログアウトしたという事実だったので、私はそれがエラーの原因であると仮定することができます。ユーザーがログインしていない状態を説明するために、ある種のif文を追加する必要がありますか? Rubyのベストプラクティスに従ってこのエラーを解決するにはどうすればよいですか?

答えて

2

per_quizを確認する前に、current_userが設定されているかどうかを確認するだけです。あなたはcurrent_user.nil?を照会することにより、ビューで簡単にログイン状態のチェックを扱うことができます:あなたはおそらく本当にたいことはログアウトし、ユーザは、ホーム・ページまたはサインインページとして、別の場所に行くことです

<% if !current_user %> 
    <p> You must be logged in to do anything useful. Please go login</p> 
<% elsif !current_user.per_quiz %> 
    <p>Cool quiz stuff goes here...</p> 
<% else %> 

。これを行うには、コントローラにいくつかの簡単なことをする必要があります。質問にコントローラコードを含めていないので、コントローラは「QuizzesController」と呼ばれると仮定します。ここで

はそれを行う方法は次のとおりです。これは何

class QuizzesController < ApplicationController 

    # Other devise authentication logic goes here... 

    before_action :authorize_user! 

    # Your actions go here... 

private 

    def authorize_user! 
    if !current_user 
     redirect_to '/', notice: "You must be logged in to access to this page" 
    end 
    end 
end 

は、ユーザーがそれらをこのコントローラに何かをさせる前にログインしていることを確認します「before_action」ハンドラをインストールしています。ログインしていない場合は、どこにでもリダイレクトすることができます。

場合によっては、この種の処理が必要な特定のアクションのみがあることに注意してください。その場合は、:onlyまたは:exceptオプションを使用して、処理されるアクションまたは処理されないアクションを指定することができます。

before_action :authorize_user!, only: [ :new, :edit, :create ] 

またはこのような:

before_action :authorize_user!, except: :list 

これはあなたにdevise認証一部を扱う方程式の承認一部を管理する上でより大きな柔軟性を与えることはこのようになります。

+0

ああ!これはまさに私が探していたものです!ありがとうございました! – Liz

+0

注:明示的に 'false'の値を扱っていない限り、' .nil? 'との比較は不要です。 – tadman

1

私は、これはこれを行うには「正しい」Rubyの道であるかどうかわからないんだけど、私は最終的に見つかった道があれば/ ELSIF/else文に変更しました:

<% if current_user.nil? %> 
    ... 
<% elsif current_user.bal_quiz.nil? %> 
    ... 
<% else %> 
    ... 
<% end %> 

おそらくべき質問を投稿する前にこれを理解したことがありますが、これを行うためのより良い、または「もっとRubyの」方法があるかどうかを調べることに興味がありました(そしてまだまだです)。

2

これは、ユーザーがログインしていないときはcurrent_userがnilであるためです.nilでいくつかのメソッドを呼び出すと、NoMethodErrorがスローされます。

私はあなたがビューで提供したコードを持っていると仮定します。ユーザーがログインしているのであれば、あなたは確認することができます。

<% if user_signed_in? %> 
    # do smth with user quizzes 
<% else %> 
    # do something else 
<% end %> 

をしかし、最善の方法は、コントローラにフィルタの前に使用し、そのページを見ることが匿名を許可しないことです。

ここに、Railsを使用したアプリケーション例があります。 https://github.com/RailsApps/rails-devise

希望に役立ちます。

関連する問題