2012-03-21 5 views
2

私は名前や電子メールなどの方法がレールにデフォルトであると思ったのですか?エラーが発生するのはなぜですか?nilのための未定義メソッド `name ':Ruby on RailsのNilClassですか?

<% if logged_in? %> 
<% provide(:title, @user.name) %> 
<% else %> 
<% provide(:title, 'Profile')%> 
<% end %> 

が、私は私のstatic_page_controller

def profile 
    @user = User.find_by_remember_token(:remember_token) 
end 

私はコンソールUser.find_by_remember_tokenに行く(「actualtokenに入れる:私の静的なページで

はprofile.html.erbに私が持っている、ビュー").nameは私に適切なユーザー名を返しますが、remember_tokenはそれを返しません。どうすればいいですか?remember_token =ログインしたユーザーがトークンを覚えていますか?私sessions_helperで

は、私が何かを達成していなかった私のstatic_pages_helperにコピー

def log_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    current_user = user 
    end 

    def logged_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
     @current_user ||= user_from_remember_token 
    end 

    def log_out 
    current_user = nil 
    cookies.delete(:remember_token) 
    end 


    private 

    def user_from_remember_token 
     remember_token = cookies[:remember_token] 
     User.find_by_remember_token(remember_token) unless remember_token.nil? 
    end 
end 

持っています。

答えて

2

クイック物事のセッションヘルパーを必要とすることもできます。

  • Aあなたのヘルパーに定義されている関数は、すべてのヘルパーとビューで利用できるようになります(異なるヘルパーから同じ関数をコピー&ペーストする理由はありません)。
  • あなたはおそらく認証宝石を使用していますが、私はDevise宝石だと思います。これが正しければ、あなたはこれを行う理由がない限り、ヘルパーを無効にするべきではありません。
  • User.anythingは、ユーザクラスの静的関数と呼びます。
  • user = User.find_by_anything(the_thing)はActiveModelによって提供されるクラスの静的ヘルパーで、データベースに* anything = the_thing *を持つユーザーを検索します。このユーザーまたはnilが返されます。
  • user.an_attributeは、ユーザーが指定した属性(デフォルトではこの属性の列名と同じ)を返す関数を呼び出します。
  • user.try(:anything)は、ユーザーから何も呼び出さずにその値を返します。 userがnilの場合、返される値もnilになります。

    user = current_user.try(:remember_token) 
    

    EDITED:質問は少し厄介ですが、私、私は次のように達成することができ、あなただけの現在のユーザーはトークンを覚えて取得したいと思います言っ

def profile 
    @user = User.find_by_remember_token(params[:remember_token]) 
end 

paramsハッシュでリクエストのパラメータにアクセスする必要があります。

+0

すべての有益な情報ありがとう。 paramsをCookieに置き換えなければならなかった:User.find_by_remember_token(params [:remember_token])、これはエラーのおかげで解決した。 – Laser

1

EDIT:完全に1

:-)願わくばとして愚かではないと私の最初の答えを置き換える(Railsの内のセッションを実施し、管理するためのいくつかの方法がありますが、デフォルトでは、キーを参照するには、ブラウザでクッキーを使用していますセッションはブラウザからのリクエストによって作成されるので、コンソールを使って既存のセッションにアクセスすることは可能ですが、おそらくあなたが望むものではありません。)

あなたのメソッドuser_from_remember_tokenは、ユーザーまたはゼロ。あなたのコードに表示されないのは、のユーザーモデルのremember_tokenを設定する場所です。私はそこにいると仮定しますが、見つからない場合にログインするようにユーザーに指示するコードが必要な場合があります。一般的なパターンは

def current_user 
    @current_user ||= user_from remember_token 
    unless @current_user 
    flash[:notice] = "Yo! Log in first." 
    redirect_to login_path and return 
    end 
end 

です。モデルファインダーを別のコントローラーから呼び出すことは問題ありません。しかし、なぜUser.find_by_remember_token(:remember_token)を呼び出すのですか?あなたはまだremember_tokenを持っていません(そうですか?)。セッションヘルパーでcurrent_userメソッドを呼び出すだけではいけませんか?

方法が表示されていない場合、あなたはレールのフレームワークおよびRuby言語を認識する必要があります含めるか、application_controller.rb

+0

私はattr_accessibleという名前のuser.rbというクラスのモデルを持っています:name、:emailなどstatic_pages.rbモデルも作成する必要がありますか? – Laser

+0

ああ、まあまあ私の悪い - 私はあなたの記事を読んでほとんど失敗したと思う...私はそれを見逃した一体どのように確信していない!私は私の答えを編集します。申し訳ありません、です。 –

+0

ハハk、ありがとう。 – Laser

関連する問題