English 中文(简体)
Ajax Question - Ruby on Rails - Error: Couldn t Find Post without an ID
原标题:

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.

最佳回答

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" %>
问题回答

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

<%= render :partial => @post %>




相关问题
ajax login using httpRequest?

I am trying to develop my login script to give feedback to the user if the login is valid or not. Basically if it isn t correct a div box will show saying its wrong, if its correct it will show its ...

Virtual Tour using sketch up, ajax, flash technologies

I want to know if there are existing technology that make your 3d models in sketch into virtual tours, using either Ajax or Flash for web presentation. If there s none, which will be a good approach ...

How can i update div continuously

I have asp.net application where i have a div which showing the value from other site. The value of that site is changing continuously. I want that my div will automatically update in some interval ...

热门标签