2017-01-07 11 views
0

私は現在、Michael Hartlのrailstutorial.orgを見ており、Google/Stackoverflowが応答していないと思われる質問に遭遇しました。このチュートリアルでは、show.htmlに<%= @user.name %>, <%= @user.email %>を入れてユーザー情報を表示しています。 erb。コントローラーでは、@user = User.find(params[:id])の方法をshowと定義しています。コントローラで使用されているため、ビューで使用できないのはなぜですか?

私は理解していないのは、次のコードが同じ結果を生成しない理由です(コントローラーからshowメソッドを削除して、ビューにすべてのコードを配置しようとしました)。これらはshow.html.erbする私の版です:

<%= @user.find(params[:id]).name %>, <%= @user.find(params[:id]).email %>

それは、 "未定義のメソッド` nilのために「が見つかり:NilClass" を返します。

答えて

0

<%= @user.find(params[:id]).name %>が発生した理由エラー undefined method 'find' for nil:NilClassは、@userがコントローラのshowメソッドから削除したインスタンス変数であるためです。だから今、@userはnilであり、存在しません。また、データベースを照会する場合は、@userではなくUserの(モデル)名を使用する必要があります。

これを行う悪い練習は、もしあなたがしたいのであれば、<%= User.find(params[:id]).name %>(正しいIDである限り)とすることができます。あなたのパラメータはコントローラ内にあるように、ビュー内で利用可能です。それが動作するために

def show end

最後に、あなたがショーのビューを使用する場合、あなたは完全にshowメソッドを削除することはできません、あなたは、少なくともを持っている必要があります。

+0

偉大な応答、ありがとうございます。ええと、私はMVCの方法をよりよく理解するためになぜ背後にあるのかという理由だけでは不思議ではないと理解しました。 – michaelsking1993

0

あなたが本当にビューのロジックの多くを持っていないはずですが、私はあなたが探しているコードがあると思う:

<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %> 
0

のparamsは、おそらくビューでは使用できません、それはいけません。

コントローラでデータ準備を行う必要がある主な理由は、データの問題を捕捉するための問題です。それがコントローラーが存在する理由です。

レールサイドクエリキャッシングではない場合、コードはデータベースで2つの要求を1つではなく2つにします。

コントローラに@userを準備し、ビューにアクセスします。コードのテストとリファクタリングが容易になり、読みやすさが大幅に向上します。

<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %> 

VS.を比較します

私はあなたが他の回答から、今では理解し、おそらくあなたはビューでこのロジックを持つべきではないチュートリアルでは、しかし、あなたの質問に答えることを確信している
<%= @user.name %>, <%= @user.email %> 
関連する問題