2012-04-10 54 views
5

我一直在通過Stack Overflow搜索幾個小時,但沒有一個相關的問題似乎適用於我的問題。控制器中的額外實例變量是否爲零?

我是Rails的新手,這是我第一個真正的項目,我可能會混淆MVC設置。我試圖給@stars實例變量賦值,而在searches_controller.rb的動作:

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

@search創建優良,是具有不同參數的複雜搜索。 tempstr只是一個簡單的字符串容器,用於searchstr(@search)的結果,這是一種將搜索參數轉換爲與MySql相關的字符串的快速方法(在這種情況下,這似乎比嘗試正常使用.where幫助程序更容易)。我確信我可以直接將searchstr(@search)放入.where中,但現在我將它們分開,以便在元素通過時檢查它們。

無論如何,當我嘗試在show.html.erb視圖中調用@stars時,問題就出現了。即使這樣簡單的東西:

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

我得到一個錯誤說'each' is not a method of nil:NilClass。所以,我把它改成下面來看看@stars是零:

<%= @stars.inspect %> 

果然,@starsnil。然而,當我這行添加到我的控制器檢查@stars有:

return render @stars.each 

我看到變量充滿了從Star.where(正確的星空對象),就像我本來打算。一個快速的.inspect顯示在控制器中變量不是零。

所以,我不確定爲什麼視圖接收它爲零,如果它已經在控制器中定義好了。不過,如果我誤解MVC的工作原理,我不會感到驚訝。 Star類是在Star模型中定義的,但也許是因爲我試圖從搜索控制器訪問它,因此它未針對視圖進行初始化?

我應該以其他方式去做這件事嗎?我試圖使用局部變量(使用stars而不是@stars),但隨後視圖顯示「未定義的局部變量或方法'星號'」。

任何幫助將不勝感激,我已經傷了幾個小時創建複雜的搜索和解析星形文件數據到數據庫中,所以我有點被燒燬。如果需要,我可以提供更多信息,但我不確定還有什麼可以幫助提供答案。

+0

嗯,你當然不想要<%= @ stars.each%>;是一個錯字?另外,當tempstr已經是一個字符串時''#{tempstr}「'有點多餘。如果您在控制器中記錄或撬動'@ stars'確實包含值? – 2012-04-10 22:53:34

+0

@Dave Newton - 首先感謝捕捉tempstr;我原本打算使用rails語法來完成這個任務,這需要進行評估。對於2,那裏有一個錯字,我會在問題中解決這個問題,再次感謝。對於3,使用'logger.debug'輸出'@stars.each do | star | star.ra end'(其中'star.ra'是其中一個星號變量)似乎已經記錄了@stars的全部內容,其中包括.where應該找到的2星的所有變量。我認爲這意味着它確實包含價值觀,儘管它可以從其他地方獲得它,我想呢? – Xadera 2012-04-10 23:45:32

回答

3

您在create方法中設置了@stars,但您所談論的視圖是show.html.erb。嘗試在show方法中設置@stars。事情是這樣的:

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

如果不幫你,請出示你休息控制器動作,所以我們可以幫助你更好。

+0

是的,你絕對正確!在發佈之前不久,我就已經知道了自己的想法,但非常感謝您的回答和確認!我原本以爲顯示頁面從那裏初始化時會自動使用Create方法,但我錯了。這樣一個簡單的錯誤讓我花上好幾個小時煮我的大腦。 – Xadera 2012-04-11 07:14:26

+0

你的回答幫助我解決了完全不相關的導軌問題。你值得上升:D – kubbing 2013-08-26 23:03:48

相關問題