【问题标题】:Ajax Question - Ruby on Rails - Error: Couldn't Find Post without an IDAjax 问题 - Ruby on Rails - 错误:找不到没有 ID 的帖子
【发布时间】:2009-11-20 04:04:49
【问题描述】:

好的,我是 Rails 新手,所以我希望我能解释清楚。我似乎对收集正确信息的表格有疑问。在一个地方工作,而不是另一个地方。这是情况。

我创建了一个包含三个表格、帖子、cmets 和投票的博客。我的 cmets 工作正常,投票部分工作。这就是我的意思。

/posts/show.html.erb 文件基本上显示了帖子、相关的 cmets,并显示了该帖子的投票数。我正在投票,但使用带有隐藏字段的表单,该表单将值“1”与 post_id 一起传递到表中。然后我使用 AJAX 返回@post.votes.count。这一切都很好。

我正在尝试在 /posts/index.html.erb 页面上使用上述相同的投票/返回。在索引页面中,我有 做两件事。首先渲染 :partial => post %> 然后我有我在 show.html.erb 页面上使用的相同代码。我从终端得到的错误是

ActiveRecord::RecordNotFound(找不到没有 ID 的帖子): app/controllers/votes_controller.rb:4:in `create'

我猜这与它是索引记录集的一部分有关,它没有与页面关联的唯一帖子参数。我希望有一个简单的解决方法。代码如下:

这是正常工作的 /posts/show.html.erb 代码:

<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/>

这是它在索引页面中的位置:

<% @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/>

这是 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

这里是 /votes/create.js

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

最后,这里是部分内容,/_vote.html.erb:

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

我希望这是有道理的。如果我需要澄清任何事情,请告诉我。

【问题讨论】:

  • 您可以从 Posts 控制器发布您的显示和索引操作吗?

标签: ruby-on-rails ruby ajax blogs


【解决方案1】:

我想这会导致问题。您没有发布您的帖子控制器,但索引操作是否设置@post?:

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

【讨论】:

  • 这就是我的想法,但是当我尝试它时会搞砸。基本上整个帖子都消失了。
【解决方案2】:

看起来我只需要在 部分。

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

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

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多