2012-04-10 10 views
5

私は数時間前からStack Overflowを検索していましたが、関連する質問はどれも私の問題に当てはまりません。コントローラの余分なインスタンス変数が表示されていませんか?

これは私の最初の実際のプロジェクトであり、Railsには新しく、MVCの設定を少し混乱させるかもしれません。

def create 
    @search = Search.new(params[:search]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

@search様々なパラメータを持つ複雑な検索され、罰金作成されます:私はsearches_controller.rbのアクションにしながら、@starsインスタンス変数を割り当てるしようとしています。 tempstrは、検索パラメータをMySql関連の文字列に変換するための簡単な方法であるsearchstr(@search)の結果の単純な文字列コンテナです(この場合、通常は.helperヘルパーを使用しようとするよりも簡単です)。私はちょうどsearchstr(@search)を.whereに直接入れることができると確信していますが、それらを分割して通過するので、要素を調べることができます。

とにかく、show.html.erbビューで@starsを呼び出そうとすると、問題が発生します。でも、このような単純なもので:

<% @stars.each do |star| %> 
    <%= display stuff %> 
<% end %> 

私は'each' is not a method of nil:NilClassを言って、エラーを取得します。 @starsnilで、十分

<%= @stars.inspect %> 

確か:だから、私は@starsがnilだったかどうかを確認するために、以下にそれを変更しました。私はそこに@starsを確認するために私のコントローラに次の行を追加するときしかし、:

return render @stars.each 

を私は変数は、私が意図していたと同じように、)(Star.whereから正しいスターのオブジェクトで満たされていることがわかります。コントローラでは、素早く.inspectが変数がnilではないことを示します。

コントローラで正しく定義されていると、ビューがそれをnilとして受信している理由がわかりません。 MVCの仕組みを誤解していたとしても、私は驚くことはありません。 StarクラスはStarモデルで定義されていましたが、Searchesコントローラからアクセスしようとしているため、ビュー用に初期化されていない可能性があります。

私はこれを他のやり方で行うべきでしょうか?私はローカル変数(@starsの代わりにstarsを使用)を使用しようとしましたが、ビューに "未定義のローカル変数またはメソッド 'スター'が表示されます。

私はすでに複雑な検索を作成し、スターファイルのデータをデータベースに解析するために何時間も頭を悩まされているので、私は少し焦っています。私は要求されればより多くの情報を提供することができます、私は答えを提供するのに役立つ他に何がわからないです。

+0

まあ、あなたは確かに<%= @ stars.each%>を望んでいません。それはタイプミスですか?また、 '' tempstr''が既に文字列であるときは '#{tempstr}" 'は少し冗長です。コントローラにログオンしたり、 'pry'すると' @ stars'には本当に値が入っていますか? –

+0

@Dave Newton - 1人のために、tempstrをキャッチしてくれてありがとう。私はもともと、評価が必要だったレールの構文で.whereを行うことを意図していました。 2では、=にはタイプミスがありました。私はその質問にそれを修正します。もう一度ありがとうございます。 3の場合、 'logger.debug'を使用して' @stars.each do | star | star.ra end'( 'star.ra'は星の変数の1つです)は、.starsの内容全体を記録しているようです。これには、.whereが見つけるはずの2つの星のすべての変数が含まれています。私はそれが値を含んでいることを意味すると思います、それはどこか他の人からそれを得ることができるかもしれませんが、私は思いますか? – Xadera

答えて

3

createメソッドで@starsを設定していますが、表示しているビューはshow.html.erbです。 showメソッドでも@starsを設定してみてください。このようなもの:

これは役に立ちませんが、残りのコントローラの操作を表示してください。お手伝いしてください。

+0

はい、あなたは絶対に正しいです!私はちょうどあなたが投稿する前ではなく、自分自身を考え出していましたが、回答と確認に大変感謝しています!もともと、Showページはそこから初期化するときにCreateメソッドを自動的に使用すると思っていましたが、間違っていました。このような単純な間違いは、私の脳を調理する時間を費やすことになりました。 – Xadera

+0

あなたは私が完全に関連するレールの問題ではない解決に役立った。あなたはuptoveに値する:D – kubbing

関連する問題