2016-05-20 8 views
0

私は2つのモデルを持っています。マイクロポストとコメント。 Micropostには多くのコメントがあり、コメントはMicropostに属します。Railsページをリロードしないでマイクロポストのコレクションにコメントを追加する方法

まず、私の自宅のアクション

class StaticPagesController < ApplicationController 
    def home 
    if logged_in? 
     @micropost = current_user.microposts.build 
     @feed_items = current_user.microposts.paginate(page: params[:page]) 
    end 
    end 
(..) 

home.html.erbフィード

= render 'shared/feed' 

_feed.html.hamlがfeed_itemsに_micropost.html.haml

%li 
    %div.comments{data: { mid: "#{micropost.id}"}} 
    %div.comment_container{:id => "comments_for_#{micropost.id}"} 
     %ul 
     - comments = micropost.comments 
     - comments.each do |comment| 
      %li 
      %a{:href => user_path(comment.user), :class => "author"} 
       = comment.user.name 
      %span.comment_body= comment.body 
      %span.comment_timestamp= "created " + time_ago_in_words(comment.created_at).to_s 
    %div 
     = form_for current_user.comments.build(:micropost_id => micropost.id), | 
                :remote => true do |f| 
     = f.hidden_field :micropost_id 
     = f.hidden_field :user_id 
     = f.text_field :body, class: "form-control", placeholder: "What do you think?" 
     = button_tag(type: 'submit', class: "btn btn-default") do 
      %i.glyphicon.glyphicon-comment 
      Comment 
をレンダリング

- if @feed_items.any? 
    %ol.microposts 
    = render @feed_items 
    = will_paginate @feed_items 

をレンダリングレンダリング保持StaticPagesControllerがあります

コメントが提出されている場合は作成するアクションが私の目標は、ページ全体をリロードすることなく、その関連micropostに新しいコメントを追加することです

class CommentsController < ApplicationController 
    before_action :correct_user, only: :destroy 
    def create 
    @micropost = Micropost.find(params[:comment][:micropost_id]) 
    @comments = @micropost.comments 
    @comment = current_user.comments.build(comment_params) 
    @comment.save 
    respond_to do |format| 
     format.js 
     format.html 
    end 
    private 
    def comment_params 
     params.require(:comment).permit(
     :id, :body, :user_id, :micropost_id) 
    end 
    def correct_user 
     @comment = current_user.comments.find_by(id: params[:id]) 
     redirect_to root_url if @comment.nil? 
    end 
end 

create.js.erb

var mid = $(".comment_container").parent(".comments").data('mid'); 
$("#comments_for_" + mid).html("<%= escape_javascript(render('comments/comment')) %>") 

と呼ばれています。

私は%div.comments{data: { mid: "#{micropost.id}"}}でマークアップにmicropost.idを入れていると私はその親タグ によってmicropostをキャッチし、最後に(再)部分

にコメントをレンダリングしようとしたが、これは常に同じIDを返します。同じマイクロポストにすべての新しいコメントを挿入します。

create.js.erbのコメントのmicropost.idの知識を取得するにはどうすればよいですか?

_comment.html.erb

<ul> 
    <% @comments.each do |comment| %> 
    <li> 
     <a class="author" href="<%= user_path(comment.user) %>"> 
     <%= comment.user.name %> 
     </a> 
     <span class="comment_body"> 
     <%= comment.body %> 
     </span> 
     <span class="comment_timestamp"> 
     <%= "created " + time_ago_in_words(comment.created_at).to_s %> 
     </span> 
    </li> 
    <% end %> 
</ul> 
+0

ここでは、JSにデータを渡す際の優れた方法があります。 http://railscasts.com/episodes/324-passing-data-to-javascript –

+0

ヒントのためにクールな感謝! –

答えて

1

は、次の操作を試みることができる:あなたのcreate.js.erb

$("#comments_for_#{@comment.micropost_id}%>").html("<%= escape_javascript(render('comments/comment')) %>"); 

私は何かがあなたのjqueryのセレクタと間違っている疑いがある、とのことができます。あなたが望むものをより簡単に達成してください。

PS:部分変数にはインスタンス変数を使用しないでください。代わりに、あなたのインスタンス変数を部分集合に渡します。さもなければ、あなたのパーシャルを簡単に再利用することはできません。

+0

あなたは正しいです。$( "#comments_for _ <%= @ comment.micropost_id%>")html( "%% escape_javascript(render( 'comments/comment'))%>") ' ! –

関連する問題