我有一个模型“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
如何打印所有评论的文字?
答案 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
这应该呈现你的期望。
希望有所帮助