Ruby on rails Rails 3-控制器';新';嵌套资源返回的操作';命名错误';

Ruby on rails Rails 3-控制器';新';嵌套资源返回的操作';命名错误';,ruby-on-rails,controller,nested-attributes,Ruby On Rails,Controller,Nested Attributes,我为我的应用程序创建了一个留言板,并使用以下三种模型来完成整个工作:论坛有许多主题,主题有许多帖子。Posts是一个嵌套的主题资源,每当用户选择“createnewtopic”时,“New”操作都有一个嵌套的post来启动线程。这是它的相关代码 主题\u controller.rb class TopicsController < ApplicationController load_and_authorize_resource def new @topic = Topic

我为我的应用程序创建了一个留言板,并使用以下三种模型来完成整个工作:论坛有许多主题,主题有许多帖子。Posts是一个嵌套的主题资源,每当用户选择“createnewtopic”时,“New”操作都有一个嵌套的post来启动线程。这是它的相关代码

主题\u 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

   [...]
class TopicsController@topic}
结束
结束
[...]
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
类主题TRUE
属于:论坛,:计数器\u缓存=>TRUE
验证:title,:length=>{:maximum=>95},:presence=>{:message=>“您需要为您的主题命名。”}
接受以下内容的\u嵌套\u属性\u:posts
结束
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
class PostTRUE
属于:论坛,:触摸=>TRUE,:计数器\u缓存=>TRUE
属于:topic,:touch=>TRUE,:counter\u cache=>TRUE
验证:body,:presence=>{:message=>“您没有在body中写入任何文本。”}
结束
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 %>
forum_topics_path)do | f |%>
108,:行=>10%>
不管怎样,我完成了这项工作,效果很好

直到现在。出乎意料的是,无论什么原因,我都无法发现,每当我选择“创建一个新主题”并指向主题的“新建”操作时,我会得到一个错误“主题中的NoMethodError”#new:您有一个nil对象,但您没有预料到它!您可能期望数组的一个实例。错误发生在计算nil时。[]

当我回顾git中以前的版本时,这完全没有意义,并且没有对这段代码进行任何惊天动地的更改。也许是某些更新的Rails版本(3.0.7)或Gem造成的,但我不知道这是什么原因

不管怎么说,它的匹配行在html.erb文件中。嗯…这是新的,所以应该是零,对吗?把这个拿出来,它就起作用了。我曾尝试在主题控制器中将@post重新定义为post.new,但返回相同的错误。此外,我在谷歌上搜索过的关于这个主题的任何东西都会说@post=@topic.posts.build是一个不错的选择


那么,我是否在上面的代码中做错了什么?你知道为什么它以前可以工作,但现在不行吗?

试试这个,确保它是f.fields\u,而不仅仅是fields\u

<%= 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 %>
forum_topics_path)do | f |%>
108,:行=>10%>

我想您的表单中存在一些问题,请尝试以下操作:

<%= 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 %> 
forum_topics_path)do | f |%>
108,:行=>10%>

这就成功了。我也试过:posts,但我想我忘了添加f。在田野的前面。以前它是如何以另一种方式工作到现在的,这完全是疯狂的,但最终结果才是最重要的。非常感谢。当其他人第一个进来时,我就给了他们答案,但是是的,这样做也很有效,因为缺少f.fields\u。检查时间戳,我先回答。:)对我来说没关系……因为我们是来帮助、解决问题和分享知识的。)