0

ユーザーがサインインしているかどうかを確認するヘルパーがあります。

def signed_in?
  !current_user.nil?
end

また、セッションをチェックすることで、ビューとコントローラーがユーザーオブジェクトにアクセスできるようにするヘルパーもあります。

def current_user
  @current_user ||= User.find_by_session(session[:user_id])
end

私のコントローラーの1つでは、ユーザーオブジェクトをプルアップすることで問題なく動作します

  def index
    @households = current_user.households.all
    @household = current_user.households.build

    respond_to do |format|
      format.html
      format.xml { render xml: @households }
    end
  end

ただし、もう一方のコントローラーは、世帯関係を呼び出そうとすると、current_userヘルパーをチョークします。

def home
  @households = current_user.households.all
  @household = current_user.households.build

  respond_to do |format|
    format.html
    format.xml { render xml: @households }
  end
end

エラー:

undefined method `households' for nil:NilClass

私はかなり困惑していて、この特定の主題に関連する投稿を見つけることができませんでした。しかし、私はRailsを初めて使用します。私はこの質問を間違った方法で尋ねていますか?

前もって感謝します。

4

4 に答える 4

1

The problem isn't that the current_user helper method is unavailable to the second controller, it's that your current_user method is not finding a user and returning nil. Then your attempting to call the households method on the returned nil object.

If the current_user method was not available in that controller you would see an error message such as:

undefined local variable or method `current_user' for #<YourController:0x1057870e8>

This means you have a flaw in the flow of your logic. Either the session parameter hasn't been set yet by the time it hits that method, or it was set but to a user_id that doesn't exist.

Try adding:

def home
  @households = (logged_in? ? current_user.households.all : nil)
  @household  = (logged_in? ? current_user.households.build : nil)

  respond_to do |format|
    format.html
    format.xml { render xml: @households }
  end
end

Replacing nil with whatever your fallback data should be.

于 2012-09-17T22:22:51.947 に答える
1

モジュールを2番目のコントローラーに含めてみてください。

たとえば、ヘルパーモジュールは次のようになります。

module UserHelper
  def current_user
    @current_user ||= User.find_by_session(session[:user_id])
  end
end

次に、それをコントローラーに含めます。

class YourController < ApplicationController
  include UserHelper

  def home
    @households = current_user.households.all
    @household = current_user.households.build

    respond_to do |format|
      format.html
      format.xml { render xml: @households }
    end
  end
end
于 2012-09-17T22:05:21.580 に答える
1

current_userメソッドがnilを返す理由を見つけたかもしれません。IDではなくセッションで検索します。これを試して:

def current_user
  @current_user ||= User.find(session[:user_id])
end

または、より明確にしたい場合:

def current_user
  @current_user ||= User.find_by_id(session[:user_id])
end
于 2012-09-17T23:06:07.223 に答える
0

ここに飛び乗って自分の質問に答えるのは嫌いですが、長い間問題を抱えていたので、同じ問題を抱えている人なら誰でもこれを理解できるようにしたいと思います。これは、このページの多くの回答とMichaelHartlのチュートリアルブックが混在していることが判明しました。私はヘルパーメソッドを使用していましたが、ヘルパーを含めていませんでしたapplication_controller.rb

class ApplicationController < ActionController::Base
  include ControllerAuthentication
  include SessionsHelper
...

また、ユーザーがサインインして動的コンテンツをビューに表示することを確認していましたhome.html.erb

<% if signed_in? %>
  <!-- show the user dashboard -->
...

しかし、私はコントローラーでそのような検証をしていませんでしたstatic_pages_controller.rb

def home
  if signed_in?
  @households = current_user.households.all 
  @household  = current_user.households.build 
end

このすべてのために、エラー:

undefined method `households' for nil:NilClass

ユーザーがサインインしていないときに継続的にスローされ、にアクセスしようとしましたroot_path。他のケースではリダイレクトすることもできましたが、ログインしている場合はホームページに動的コンテンツを表示し、ログインしていない場合は静的ランディングページを表示するようにユーザーに指示しました。

助けてくれてありがとう!

于 2012-09-18T14:19:42.923 に答える