Rails 3 - «новое» действие контроллера с вложенным ресурсом, возвращающим «NoMethodError» - PullRequest
1 голос
/ 30 апреля 2011

Я создал доску объявлений для своего приложения и использую следующие три модели для работы целиком: на форумах много тем, а в темах много постов. Сообщения - это вложенный ресурс темы, и всякий раз, когда пользователь выбирает «Создать новую тему», действие «новая» имеет вложенную запись для запуска темы. Вот относительный код этого ...

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: У вас есть нулевой объект» когда вы этого не ожидали! Возможно, вы ожидали экземпляр массива. Произошла ошибка при оценке nil. [] "

Это не имеет абсолютно никакого смысла, поскольку я оглянулся на предыдущие версии в git, и в этот код не было внесено ничего потрясающего. Возможно, за это отвечает какая-то обновленная версия Rails (3.0.7) или Gem, но я не знаю об этом.

Как бы то ни было, строка, по которой он подходит, находится в файле html.erb, <% = fields_for (@post) do | cf |%>. Э-э ... это новое, так что должно быть ноль, верно? Возьми это, и это работает. Я попытался переопределить @post в контроллере темы как Post.new, но это возвращает ту же ошибку. Кроме того, все, что я гуглил на эту тему, говорит, что @post = @ topic.posts.build - это то, что нужно.

Так я что-то не так делаю в коде выше? И есть идеи, почему это будет работать раньше, а не сейчас?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Попробуйте, убедитесь, что это 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 голос
/ 30 апреля 2011

Я думаю, в вашей форме есть проблемы, попробуйте следующее:

<%= 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 %> 
...