部分渲染和rails之间的调用之间的变量

时间:2014-02-10 07:45:43

标签: ruby-on-rails

在我的项目中,我会在帖子上显示最后4条评论,然后当有人点击展开评论链接时,其他评论应显示。我有以下代码

<%= link_to demo_expand_comments_path(:post_id => post.id, comment_id => comment_id ), remote: true do %> 
   This is the link to expand comment.


<div id="comments_container_<%= post.id %>">
          <%= render :partial => 'community/comments/comment_box_posts', :collection => post.comments.order('id DESC').limit(4).reverse, :as => :comment %>
        </div>

我在这里呈现前4条评论

现在当有人点击展开评论时,会调用expand_comments操作,并在expand_comment.js.erb中有以下代码

$('#comments_container_<%= @post_id %>').prepend('<%= escape_javascript(render :partial => 'community/comments/comment_box_posts', :collection => @comments, :as => :comment) %>');

控制器动作

def expand_comments
    @post_id = params[:post_id]
    post = Post.find(params[:post_id])
    @comments = post.comments.where('id < ?', params[:comment_id]).order("created_at ASC")

我需要最后显示的comment_id

    respond_to do |format|
      format.js{}
    end

  end

现在我需要帮助的是,当调用展开评论操作时,我想发送我现在显示的帖子ID和最后一个评论ID。

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。您可以更改“展开评论”链接以及呈现评论。

在控制器中:

def expand_comments
  ...
  @comment_id = @comments.last.id

然后在expand_comment.js.erb中:

$('#comments_container_<%= @post_id %>').prepend('<%= escape_javascript(render :partial => 'community/comments/comment_box_posts', :collection => @comments, :as => :comment) %>');
$('#id_of_link').attr('href', '<%= demo_expand_comments_path(:post_id => @post_id, comment_id => @comment_id ) %>');

但这不是我喜欢的方式。

不要像url参数一样发送comment_id参数。你应该通过ajax请求发送它。

从url中删除comment_id参数,将其存储为data-attribute:

<%= link_to demo_expand_comments_path(:post_id => post.id), data: {comment_id: @comment_id} do %> 
This is the link to expand comment.
...

请注意,您还必须从link_to中删除“remote:true”。

链接点击时发送ajax请求:

$('#id_of_link').click(function() {
  $.ajax({
    type: "get",
    url: $(this).attr('href),
    data: { comment_id: $(this).data('comment_id') },
    dataType: 'script'
  });
  return false;
});

在评论渲染时更新comment_id属性:

$('#comments_container_<%= @post_id %>').prepend('<%= escape_javascript(render :partial => 'community/comments/comment_box_posts', :collection => @comments, :as => :comment) %>');
$('#id_of_link').data('comment_id', '<%= @comment_id %>');