我想寫我的第一個自定義控制器操作,並且正在運行到一個NoMethodError。通過實例變量從控制器傳遞數據到視圖,我做錯了什麼?
該場景:PostsController,帶有標準7動作腳手架生成。
我希望索引頁顯示一個帖子,而不是顯示它們的列表。每篇文章都有一個「可見」複選框。我創建了與郵政模型named_scope
稱爲visible
:
named_scope :visible, :conditions => ["visible =?", true]
,並在我的控制器應用它。去年一起index動作:
def index
@post = Post.visible.last
(format stuff)
end
編輯我的索引視圖刪除遍歷一個數組部分,所以它只顯示@post.title
等等。所以,現在我的索引只顯示了Posts表中最後一個記錄,其中True顯示爲可見。
然後我想創建一個所有文章存檔頁面,顯示所有的人,無論知名度,所以我創建了一個新的控制器動作:
(編輯爲清楚起見)
def archives
render :layout => 'posts'
@posts = Post.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @posts }
end
end
創建了一條新的命名路線:
map.archives 'posts/archives', :controller => 'posts', :action => 'archives'
以及在views/posts下面的名爲archives.html.erb的視圖。
Archives.html.erb看起來完全一樣的腳手架創建標準index.html.erb模板,用
<% for post in @posts %>
<tr>
<td><%=h post.title %></td>
...
</tr>
<% end %>
當我在瀏覽器中查看此頁時,我得到的
錯誤NoMethodError在帖子#檔案
你有一個零對象時,你沒有想到吧,你可能會認爲陣列的isntance,而評估nil.each發生錯誤,
指向在該說
<% for post in @posts %>
所以我的理解是視圖(app /視圖/帖/ archives.html.erb)的線,從在控制器動作archives
ISN實例變量的數據沒有進入視野,所以我沒有一個帖子,我沒有。我正在尋找一個原因,以及我做錯了什麼。
(當然,如果我把
<% @posts = Post.find(:all) %>
前
<% for post in @posts %>
視圖
,然後它工作得很好,但我知道這是不是我應該做的。
所有幫助,鏈接到教程來理順我等,非常感謝。
(我懷疑它的東西這個簡單的問題,但我用Rails 2.2.2和Ruby 1.8.6)
很難從您的片段中分辨出來。你可以在你的問題的底部添加Controller和View的代碼嗎? – eggdrop 2009-05-29 21:56:30