views:

120

answers:

2

Ok, I am new to rails so I hope I explain this well. I seem to have a problem with a form collecting the proper information. Work in one spot and not another. Here is the situation.

I have created a blog with three tables, posts, comments, and votes. I have comments working correctly and votes working partially. Here is what I mean.

The /posts/show.html.erb file basically shows the post, the associated comments and it shows how many votes that post has. I am working the votes but using a form with a hidden field that delivers a value of '1' along with the post_id to the table. I am then using AJAX to return the @post.votes.count. This all works great.

I am trying to use this same vote/return mentioned above but on the /posts/index.html.erb page. In the index page I have the <% @post.each do |post| %> doing two things. First render :partial => post %> and then I have the same code that I am using on the show.html.erb page. The error that I am getting from the terminal is

ActiveRecord::RecordNotFound (Couldn't find Post without an ID): app/controllers/votes_controller.rb:4:in `create'

I am guessing this has to do with it being part of the index record set which doesn't have a unique post param associated with the page. I am hoping there is a simple fix. Here is the code:

This is the /posts/show.html.erb code that is working correctly:

<div id="backto"<%= link_to 'Back to all BattleCries', posts_path %>
</div>
<%= render :partial => @post %>
<div id="beltcomments">
    <div id="beltcommenttext">
     <div id="vote">
      <div id="votes">
       <%= @post.votes.count %> People liked this BattleCry.
      </div>
     </div>
     <div id="votebutton">
      <% remote_form_for [@post, Vote.new] do |f| %>
      <%= f.hidden_field :vote, :value => '1' %>
      <%= f.submit "Like" %>
     <% end %>
     </div>
   </div>
</div>
<div id="beltcommentsbottom">
</div><br/><br/>

<div id="belt"> 
    <div id="belttext">
     <p5>Add a Comment</p5>
<% remote_form_for [@post, Comment.new] do |f| %>
    <p>
     <%= f.text_area ( :body, :class => "commentarea") %>
    </p>
    <%= f.submit "Add Comment"%>
<% end %>
</div>
<div id="beltbottom">
</div>
</div><br/>



<div id="comments">
    <%= render :partial => @post.comments %>

</div>
<br/>
<div id="commenttime">
Copyright 2009, My Life BattleCry, LLC. 
</div>
<br/>
<br/>
<br/>

Here is where it is in the index page:

<% @posts.each do |post| %>
  <%= render :partial => post %>
  <%= render :partial => @post %>  
    <div id="beltcomments">
     <div id="beltcommenttext">
      <div id="vote">
       <div id="votes">
        <%= post.votes.count %> People liked this BattleCry. 
       </div>
       <%= link_to "Comments (#{post.comments.count})", post %>
      </div>
     <div id="votebutton">
     <% remote_form_for [@post, Vote.new] do |f| %>
     <%= f.hidden_field :vote, :value => '1' %>
     <%= f.submit "Like" %>
     <% end %>
     </div>
      </div>
</div>

<br/>
<br/>
<br/>

<% end %>

<div id="commenttime">
Copyright 2009, My Life BattleCry, LLC. 
</div>
<br/>
<br/>
<br/>

Here is the votes_controller.rb

class VotesController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @vote = @post.votes.create!(params[:vote])

    respond_to do |format|
       format.html { redirect_to @post}
       format.js
     end
  end
end

Here is the /votes/create.js

page.replace_html  :votes, :partial => @vote
page[@vote].visual_effect :highlight

Lastly, here is the partial, /_vote.html.erb:

page.replace_html  :votes, :partial => @vote
page[@vote].visual_effect :highlight

I hope this makes sense. Let me know if I need to clarify anything.

A: 

I imagine this is causing problems. You didn't post your posts controller, but does the index action set @post?:

<%= render :partial => @post %>
Ben
That's what I thought but that messes things up when I try it. Basically the entire post body goes away.
bgadoci
A: 

Looks like I just needed to change the following in the <% @posts.each do |post| %> section of the index.html.erb file.

<% remote_form_for [@post, Vote.new] do |f| %>
        <%= f.hidden_field :vote, :value => '1' %>
        <%= f.submit "Like" %>

to

<% remote_form_for [post, Vote.new] do |f| %>
        <%= f.hidden_field :vote, :value => '1' %>
        <%= f.submit "Like" %>
bgadoci