Rails 3 - 控制器'新'动作,嵌套资源返回'NoMethodError'

时间:2011-04-30 16:03:00

标签: ruby-on-rails controller nested-attributes

我为我的应用程序创建了一个留言板,并使用以下三个模型来处理整个事情:论坛有很多主题,主题有很多帖子。 Posts是Topic的嵌套资源,每当用户选择“Create New Topic”时,“new”动作都有一个嵌套的帖子来启动该帖子。这是相关的代码......

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 #new:你有一个零对象当你没想到的时候!你可能已经预料到了一个Array的实例。在评估nil时发生了错误。[]“

当我回顾git中的先前版本时,这完全没有意义,并且没有对此代码进行任何破坏性的更改。也许一些更新的Rails版本(3.0.7)或Gem负责,但我不知道这一点。

无论如何,它投入的线是在html.erb文件中,&lt;%= fields_for(@ post)do | cf |%&gt;。呃......它是新的所以它应该是零,对吧?拿出来,它的工作原理。我尝试在Topic控制器中重新定义@post为Post.new,但是返回相同的错误。另外,我搜索过这个主题的任何内容都说@post = @ topic.posts.build是要走的路。

我在上面的代码中做错了吗?任何想法为什么它以前会工作,但现在不是吗?

2 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分: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 %>