私は数時間前から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
を言って、エラーを取得します。 @stars
がnil
で、十分
<%= @stars.inspect %>
確か:だから、私は@starsがnilだったかどうかを確認するために、以下にそれを変更しました。私はそこに@stars
を確認するために私のコントローラに次の行を追加するときしかし、:
return render @stars.each
を私は変数は、私が意図していたと同じように、)(Star.whereから正しいスターのオブジェクトで満たされていることがわかります。コントローラでは、素早く.inspectが変数がnilではないことを示します。
コントローラで正しく定義されていると、ビューがそれをnilとして受信している理由がわかりません。 MVCの仕組みを誤解していたとしても、私は驚くことはありません。 StarクラスはStarモデルで定義されていましたが、Searchesコントローラからアクセスしようとしているため、ビュー用に初期化されていない可能性があります。
私はこれを他のやり方で行うべきでしょうか?私はローカル変数(@stars
の代わりにstars
を使用)を使用しようとしましたが、ビューに "未定義のローカル変数またはメソッド 'スター'が表示されます。
私はすでに複雑な検索を作成し、スターファイルのデータをデータベースに解析するために何時間も頭を悩まされているので、私は少し焦っています。私は要求されればより多くの情報を提供することができます、私は答えを提供するのに役立つ他に何がわからないです。
まあ、あなたは確かに<%= @ stars.each%>を望んでいません。それはタイプミスですか?また、 '' tempstr''が既に文字列であるときは '#{tempstr}" 'は少し冗長です。コントローラにログオンしたり、 'pry'すると' @ stars'には本当に値が入っていますか? –
@Dave Newton - 1人のために、tempstrをキャッチしてくれてありがとう。私はもともと、評価が必要だったレールの構文で.whereを行うことを意図していました。 2では、=にはタイプミスがありました。私はその質問にそれを修正します。もう一度ありがとうございます。 3の場合、 'logger.debug'を使用して' @stars.each do | star | star.ra end'( 'star.ra'は星の変数の1つです)は、.starsの内容全体を記録しているようです。これには、.whereが見つけるはずの2つの星のすべての変数が含まれています。私はそれが値を含んでいることを意味すると思います、それはどこか他の人からそれを得ることができるかもしれませんが、私は思いますか? – Xadera