2011-04-30 65 views
1

我爲我的應用程序創建了一個留言板,並使用以下三個模型來處理整個事情:論壇有很多主題,主題有很多帖子。 Posts是Topic的嵌套資源,每當用戶選擇「Create New Topic」時,'new'操作都有一個嵌套的帖子來啓動線程。這裏是一個相對碼...Rails 3 - 嵌套資源返回的控制器'new'動作'NoMethodError'

topics_controller.rb

class TopicsController < ApplicationController 
    load_and_authorize_resource 
    def new 
    @topic = Topic.new 
    @post = @topic.posts.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @topic } 
    end 
    end 

    [...] 

topic.rb

class Topic < ActiveRecord::Base 
    has_many :posts 
    belongs_to :user, :counter_cache => TRUE 
    belongs_to :forum, :counter_cache => TRUE 
    validates :title, :length => { :maximum => 95 }, :presence => { :message => "You need to title your topic." } 

    accepts_nested_attributes_for :posts 
end 

post.rb

class Post < ActiveRecord::Base 
    belongs_to :user, :counter_cache => TRUE 
    belongs_to :forum, :touch => TRUE, :counter_cache => TRUE 
    belongs_to :topic, :touch => TRUE, :counter_cache => TRUE 

    validates :body, :presence => { :message => "You have not written any text in the body." } 
end 

new.html.erb

<%= form_for(@topic, :url => forum_topics_path) do |f| %> 
    <%= f.label :title %><%= f.text_field :title %> 

    <%= fields_for(@post) do |cf|%> 
     <%= cf.label :body %><%= cf.text_area :body, :cols=> 108, :rows => 10 %> 
    <% end %> 

    <%= f.submit %> 
<% end %> 

無論如何,我完成了這一點,它工作得很好。

直到現在。無緣無故,無論我有什麼理由,無論何時,只要選擇「創建新主題」並指向主題上的「新」操作,我都會收到「NoMethodError in Topics#new」錯誤:您有一個無對象當你沒有想到的時候,你可能已經期待了一個Array的實例,在評估nil時出現了錯誤[]「

這使得絕對沒有任何意義,因爲我回頭看看以前的版本在git中,這個代碼沒有任何破壞性的變化。也許一些更新的Rails版本(3.0.7)或Gem負責,但我不知道這一點。

無論如何,它正在拋出的線在html.erb文件中,<%= fields_for(@post)do | cf |%>。呃...這是新的,所以它應該是零,對不對?把它拿出來,它就可以工作。我試着在Topic控制器中重新定義@post作爲Post.new,但是它返回相同的錯誤。另外,我在Google上搜索的任何內容都說@post = @ topic.posts.build是要走的路。

所以我在上面的代碼中做錯了什麼?以及任何想法,爲什麼它會以前工作,但現在不?

回答

2

試試這個,確保它是f.fields_for而不只是fields_for。

<%= form_for(@topic, :url => forum_topics_path) do |f| %> 
    <%= f.label :title %><%= f.text_field :title %> 

    <%= f.fields_for(@post) do |cf|%> 
     <%= cf.label :body %><%= cf.text_area :body, :cols=> 108, :rows => 10 %> 
    <% end %> 

    <%= f.submit %> 
<% end %> 
+0

答曰到其他人,因爲他們排在第一,但沒錯,嘗試這種方式的工作原理也一樣,它缺乏f.fields_for。 – Shannon 2011-04-30 16:32:21

+0

檢查時間戳,我先回答。 :) – mbreining 2011-04-30 16:33:14

+0

哎呀,你是對的,修好了。是的,這很公平。 – Shannon 2011-04-30 16:37:30

1

我想有在表單一定的問題,請嘗試以下操作:

<%= form_for(@topic, :url => forum_topics_path) do |f| %> 
    <%= f.label :title %><%= f.text_field :title %> 

    <%= f.fields_for :posts do |cf|%> 
     <%= cf.label :body %><%= cf.text_area :body, :cols=> 108, :rows => 10 %> 
    <% end %> 

    <%= f.submit %> 
<% end %> 
+0

這是做到了。我也試過:帖子,但我想我忘了添加f。在fields_for前面。完全瘋狂的它到目前爲止如何以其他方式工作,但最終的結果是重要的。非常感謝你。 – Shannon 2011-04-30 16:31:22