簡易的な画像投稿サイトを開発しています。
①投稿(post)
②投稿へのコメント(comment)
投稿詳細画面(posts/show)で投稿(post)へのコメント(comment)をする際に、ajaxで処理したいと考えています。
現在、以下までは実装できました。
①posts/show
で投稿を表示
②posts/show
のviewからform_forでコメントをcomments/create
にPOST
③comments/create
でcommentを保存
④comments/create
からcomments/create.js.slim
が呼ばれる
ここまでは問題なく処理が流れています。
しかし④で以下のコードを書いたところ・・・
javascript
1// ajaxのレスポンスが帰ってきたら、コメントの値をフォームから削除 2$('#comment').val(''); 3// コメント数をカウントアップ 4$('#comment_count_num').html(@comments_count); 5// コメント内容を追加表示 6$('.comment_wrapper').append("#{ j(render "shared/comment")}").hide().fadeIn('slow');
以下のエラーになります。
ActionView::Template::Error (Unknown line indicator /home/vagrant/sample_project/app/views/comments/create.js.slim, Line 2, Column 0 $('#comment').val(''); ^
④のコードのセレクタはviews/posts/show.html.slim
に存在するものです。
views/comments/create.js.slim
からviews/posts/show.html.slim
のセレクタは指定できないのでしょうか?
その場合、今回のように異なるcontroller間の異なるactionでajaxの処理をする場合、レスポンスを受け取るjsからどのようにレスポンスデータをview側に追加すれば良いのでしょうか?
【追記】各ページのソースは以下になります。
posts/show
のview(views/postsの中にあります)
html
1h1.title 投稿詳細 2.post_container 3 p.post_user_name 4 = link_to @post.user.user_name, user_path(@post.user_id), class:'box_link user_link' 5 = image_tag @post.post_image_url.url,alt:'post' 6 7 h1.post_title #{@post.post_title} 8 p.post_text #{@post.post_text} 9 10 .post_info.clearfix 11 p.view_count 12 span #{@post.view_count} 13 'view 14 15 p.comment_count 16 | コメント 17 span#comment_count_num #{@post.comments_count} 18 '件 19 20 time.post_time = time_ago_in_words(@post.created_at) +'前' 21 22 - if @post.comments_count > 5 23 p#read_more もっと読む... 24 25 - @comments.each do |comment| 26 .comment_wrapper.clearfix#0 27 .comment_container.clearfix 28 = link_to user_path(comment.user_id),class:'comment_user_link' do 29 p.user_name #{comment.user.user_name} 30 31 p.comment #{comment.comment_text} 32 time.comment_time = time_ago_in_words(comment.created_at) +'前' 33 34 35 - if logged_in? 36 .comment_form_wrapper.clearfix 37 p#js_image_error.input_error 38 = form_for(@comment,data:{ remote: true}) do |f| 39 = f.hidden_field :user_id,value: current_user.id 40 = f.hidden_field :post_id,value: @post.id 41 = f.text_field :comment_text,placeholder: 'コメントする',id: 'comment',class: 'comment_form' 42 = f.submit '投稿',id: 'post_comment', class: 'comment_form_btn',disable_with: '投稿しています。' 43 - else 44 .recommend_login_box 45 p.recommend_login 新規登録/ログインしてコメントする
comments/create
controller
ruby
1def create 2 @comment = current_user.comments.build(comment_params) 3 if @comment.save 4 @comments_count = update_comments_count(@comment.post_id) 5 6 # render json: @comment 7 # render 8 else 9 flash.now[:danger] = 'コメントに失敗しました。再度お試しください。' 10 render 'posts/show' 11 end 12 end
comments/create
のレスポンスを受け取るviews/comments/
にあるcreate.js.slimファイル。
javascript
1// ajaxのレスポンスが帰ってきたら、コメントの値をフォームから削除 2$('#comment').val(''); 3// コメント数をカウントアップ 4$('#comment_count_num').html(@comments_count); 5// コメント内容を追加表示 6$('.comment_wrapper').append("#{ j(render "shared/comment")}").hide().fadeIn('slow');
views/shared/
にある_comment.html.slimファイル。
create.js.slimから呼び出したい・・・。
html
1.comment_container.clearfix 2 = link_to user_path(@comment.user_id),class:'comment_user_link' do 3 p.user_name #{@comment.user.user_name} 4 5 p.comment #{@comment.comment_text} 6 time.comment_time = time_ago_in_words(@comment.created_at) +'前'
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。