2009-05-29 33 views
0

我想寫我的第一個自定義控制器操作,並且正在運行到一個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)

+0

很難從您的片段中分辨出來。你可以在你的問題的底部添加Controller和View的代碼嗎? – eggdrop 2009-05-29 21:56:30

回答

2

這是正確的:

respond_to do |format| 
    format.html { render :layout => 'posts' } 
    format.xml { render :xml => @posts } 
    end 
end 

@posts是視圖不被視圖識別,因爲它在渲染視圖後被實例化。 'render'應該是一個動作中最後一個被執行的行。

相關問題