2016-12-14 15 views
0

をレンダリングするときにオブジェクトの配列をつかむことができません。Railsが、私は2つのコントローラを持って、私はコントローラのアクション

class SessionsController < ApplicationController 

def create 
    @person = Person.find_by(email: params[:session][:email].downcase) 
    if @person && @person.authenticate(params[:session][:password]) 
    session[:user_id] = @person.id 
    render('people/index') 
    else 
    render('session/new') 
    end 
end 

class PeopleController < ApplicationController 

def index 
    @person = Person.all 
end 

私の見解は以下の通りです:

... 

<% @person.each do |p| %> 
<tr> 
    <td><%= p.name %></td> 
    <td><%= p.gender %></td> 
    <td><%= p.birthdate %></td> 
    <td><%= p.interests_concatenated %></td> 
</tr> 
<% end %> 

私は、ユーザーの資格情報を入力した場合と、ログインしようとすると、次のエラーメッセージが表示されます。

NoMethodError in Sessions#create /Users/fizz/workspace/rails_people/app/views/people/index.html.erbを表示しています#Personの定義済みメソッド `each ':0x007fd345aa1778

RailsがPerson.all配列を取得せずに@person変数に設定しているようですが、なぜですか?

答えて

1

renderメソッドは、現在のアクションのデータを使用してテンプレートをレンダリングするだけです。代わりにredirect_toを使用してください。 HTTPリクエストに戻って応答を処理するためにRails layouts and rendering guide:

から

もう一つの方法は、 redirect_toです。あなたが見てきたように、レンダリングはどのようなビュー(または他の アセット)を使ってレスポンスを作成するかをRailsに伝えます。 redirect_toメソッドは を全く別のものにします:ブラウザに新しい リクエストを送信するように指示します。

あなたは、おそらくこのような何かしたい:

def create 
    @person = Person.find_by(email: params[:session][:email].downcase) 
    if @person && @person.authenticate(params[:session][:password]) 
    session[:user_id] = @person.id 
    redirect_to people_path 
    else 
    render 'new' 
    end 
end 

注意コントローラがsessionsないsessionあるので、私はまたrender 'new'にそれを変更して、あなたがこの場合であっても、それを指定する必要はありません。

people#indexアクションの@personインスタンス変数の名前を@peopleに変更することも考えます。

+0

これはうまくいきましたので、ご説明いただきありがとうございます。レンダリングを使うと、Railsはpeople/index.html.erbをセッション#データ内のデータだけを使ってフェッチし、#indexの処理を完全にスキップします。 – MLZ

+1

別のコントローラーアクションにアクセスするための新しい要求を行う必要があります。 renderメソッドはリクエストを行いませんが、redirect_toメソッドはリクエストを行います。 – etdev

+0

Gotcha、もう一度感謝します。 – MLZ

関連する問題