This project is archived and is in readonly mode.

Nested objects return extra nil array
Reported by brpratt (at gmail) | October 22nd, 2010 @ 09:28 PM
Nested objects in 3.0.1 seem to have some sort bug that returns a null object.
Posts class :has_many comments
Comments class :belongs_to post
In routes.rb I have set up
resources :posts do
resources :comments
end
I have 1 post and 1 comment. In console, when I do a
Posts.comments.count, I get 1. Even in my view (comments are
displayed on the show_post.html) I do a @post.comments.count which
claims 1, but I'm still getting a comment returned to my web
program (every field in the comment hash is nil except for the
post_id field). Even when I have NO comments in the database, I get
an extra comment object with everything set to nil but the post_id.
I've cleared and repopulated my database so I know it's not a data
issue. Confirmed in my WEBrick server window when I told my script
to put comments.
[#<Comment id: 1, name: "test", body: "test comment", post_id: 1, created_at: "2010-10-22 16:52:42", updated_at: "2010-10-22 16:53:28">, #<Comment id: nil, name: nil, body:nil, post_id: 1, created_at: nil, updated_at: nil>]
Even though Comment.count for my whole database is 1 in both
console and in browser.
Might not be a bug, but I can't think of anything else at this point, especially since a co-worker confirmed the same thing happening to them.
Comments and changes to this ticket
-
-
Aditya Sanghi October 23rd, 2010 @ 03:52 PM
- State changed from new to needs-more-info
- Importance changed from to Low
It looks like you're doing a build on a post by default somewhere (perhaps a before_filter somewhere?). Please post part of your controller/model code and clear steps to reproduce the error.
-
-
brpratt (at gmail) October 25th, 2010 @ 03:35 PM
If it was doing a build by default wouldn't that be reflected in the db? Why would Comment.count show 0 and then my app gets an extra comment?
This app is pretty much word-for-word from the rails guide for the blog app...
http://guides.rubyonrails.org/getting_started.htmlI'll repost critical elements here to make it easier.
comments controller:
class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.create(params[:comment]) redirect_to post_path(@post) end def destroy @post = Post.find(params[:post_id]) @comment = @post.comments.find(params[:id]) @comment.destroy redirect_to post_path(@post) end end
class Comment < ActiveRecord::Base belongs_to :post end
class Post < ActiveRecord::Base validates :name, :presence => true validates :title, :presence => true, has_many :comments end
-
brpratt (at gmail) October 25th, 2010 @ 03:47 PM
Interestingly I found in the form:
<h2>Add a comment:</h2> <%= form_for([@post, @post.comments.build]) do |f| %> <%= f.error_messages %> <div class="field"> <%= f.label :commenter %><br /> <%= f.text_field :commenter %> </div> <div class="field"> <%= f.label :body %><br /> <%= f.text_area :body %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
If I changed the @post.comments.build object to @post.comments.new, it stopped returning a nil object in the array.
-
brpratt (at gmail) October 25th, 2010 @ 03:47 PM
Interestingly I found in the form:
<h2>Add a comment:</h2> <%= form_for([@post, @post.comments.build]) do |f| %> <%= f.error_messages %> <div class="field"> <%= f.label :commenter %><br /> <%= f.text_field :commenter %> </div> <div class="field"> <%= f.label :body %><br /> <%= f.text_area :body %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
If I changed the @post.comments.build object to @post.comments.new, it stopped returning a nil object in the array.
-
Aditya Sanghi October 25th, 2010 @ 04:59 PM
- State changed from needs-more-info to invalid
Marking ticket as invalid for now as it's clear where your object is coming from.
Please see documentation related to active record. It is clear that @post.comments.build is the way to build associations (not new).
Doing build will create an object but not save it of course.
-
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>