Rails:如何使用ajax渲染块?

时间:2014-12-09 19:28:28

标签: ruby-on-rails ruby ajax ruby-on-rails-4 controller

我有一个模型“Thing”,其中有很多“评论”。当按下“发表评论”按钮时,我希望@ thing.com的列表用ajax刷新。

此代码用于列出第一条评论的文本:

查看

<script type="text/javascript">
  $("#post").click(function () {
    $.get( "<%= postcomment_thing_path(:id => @thing.id) %>", function( data ) {
      $('#comments_h2').html(data);
    });
  });
</script>

控制器:

def postcomment
  @thing = Thing.find(params[:id])
  render text: @thing.comments.first.text.to_s
end

但是当我尝试打印整个注释块时,它只打印一个单独的“#”。

控制器:

def postcomment
  @thing = Thing.find(params[:id])
  render text:
    @thing.comments.each do |comment|
      comment.text.to_s
    end
end

如何打印所有评论的文字?

3 个答案:

答案 0 :(得分:0)

你应该添加一个&#34; remote:true&#34;发表评论&#34;发表评论&#34;按钮。从那里,您可以让您的控制器respond_to | format |并实时更新数据。

有关在Rails中使用ajax的更多信息,请参阅here

答案 1 :(得分:0)

您不需要在发布新评论时加载所有评论,使用rails加载旧评论并显示它们,然后使用ajax将新的评论附加/添加到旧列表中。

我认为你的评论是在div中:

<div class="comments">
  <% @thing.comments.each do |comment| %>
    <div class="comment_<%= comment.id %>">
      <%= comment.content %>
    </div>
  <% end %>
</div>

您在添加评论的位置应该有remote: true

<%= form_for @comment, remote: true do |f| %>
   inputs here
<% end %>

当您添加评论时,我认为它的动作创建正在被调用,因此您需要create.js.erb文件夹中的app/views/comments/文件和同一位置的_comment.html.erb。< / p>

create.js.erb将包含您的js代码,该代码会将评论附加/添加到div.comments元素:

<% if @comment.valid? %>  // @comment should be loaded in controller create action.
  $('div.comments').append("<%= j(render(@comment)) %>");
  $("#new_comment")[0].reset();
<% else %>
  alert("Can't add comment");
<% end %>

答案 2 :(得分:0)

嗯,虽然按照@ rmagnum2002的建议再次显示所有评论并不是一个好主意。您应该根据您的要求添加或添加当前注释。但是,要使当前代码正常工作,您必须进行一些更改

def postcomment
  @thing = Thing.find(params[:id])
  comment_text = ""
  @thing.comments.each do |comment|
     comment_text += comment.text.to_s
   end 
  # you could use map and join them by a delimiter also 
  render text: comment_text        
end

这应该呈现你的期望。

希望有所帮助