質問編集履歴

1 ソースの追記

gogoackman3

gogoackman3 score 101

2016/09/30 01:48  投稿

【rails】【ajax】レスポンスを受け取るjsからうまくviewを変更出来ません。
簡易的な画像投稿サイトを開発しています。
①投稿(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
// ajaxのレスポンスが帰ってきたら、コメントの値をフォームから削除
$('#comment').val('');
// コメント数をカウントアップ
$('#comment_count_num').html(@comments_count);
// コメント内容を追加表示
$('.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側に追加すれば良いのでしょうか?
その場合、今回のように異なるcontroller間の異なるactionでajaxの処理をする場合、レスポンスを受け取るjsからどのようにレスポンスデータをview側に追加すれば良いのでしょうか?
【追記】各ページのソースは以下になります。
`posts/show`のview(views/postsの中にあります)
```html
h1.title 投稿詳細
.post_container
 p.post_user_name
   = link_to @post.user.user_name, user_path(@post.user_id), class:'box_link user_link'
 = image_tag @post.post_image_url.url,alt:'post'
 
 h1.post_title #{@post.post_title}
 p.post_text #{@post.post_text}
 
 .post_info.clearfix
   p.view_count
     span #{@post.view_count}
     'view
   
   p.comment_count
     | コメント
     span#comment_count_num #{@post.comments_count}
     '件
   
   time.post_time = time_ago_in_words(@post.created_at) +'前'
   
 - if @post.comments_count > 5
   p#read_more もっと読む...
 
 - @comments.each do |comment|
   .comment_wrapper.clearfix#0
     .comment_container.clearfix
       = link_to user_path(comment.user_id),class:'comment_user_link' do
         p.user_name #{comment.user.user_name}
       
       p.comment #{comment.comment_text}
       time.comment_time = time_ago_in_words(comment.created_at) +'前'
   
     
 - if logged_in?
   .comment_form_wrapper.clearfix
     p#js_image_error.input_error
     = form_for(@comment,data:{ remote: true}) do |f|
       = f.hidden_field :user_id,value: current_user.id
       = f.hidden_field :post_id,value: @post.id
       = f.text_field :comment_text,placeholder: 'コメントする',id: 'comment',class: 'comment_form'
       = f.submit '投稿',id: 'post_comment', class: 'comment_form_btn',disable_with: '投稿しています。'
 - else
   .recommend_login_box
     p.recommend_login 新規登録/ログインしてコメントする
```
`comments/create`controller
```ruby
def create
   @comment = current_user.comments.build(comment_params)
   if @comment.save
     @comments_count = update_comments_count(@comment.post_id)
     # render json: @comment
     # render
   else
     flash.now[:danger] = 'コメントに失敗しました。再度お試しください。'
     render 'posts/show'
   end
 end
```
`comments/create`のレスポンスを受け取る`views/comments/`にあるcreate.js.slimファイル。
```javascript
// ajaxのレスポンスが帰ってきたら、コメントの値をフォームから削除
$('#comment').val('');
// コメント数をカウントアップ
$('#comment_count_num').html(@comments_count);
// コメント内容を追加表示
$('.comment_wrapper').append("#{ j(render "shared/comment")}").hide().fadeIn('slow');
```
`views/shared/`にある_comment.html.slimファイル。
create.js.slimから呼び出したい・・・。
```html
.comment_container.clearfix
 = link_to user_path(@comment.user_id),class:'comment_user_link' do
   p.user_name #{@comment.user.user_name}
 
 p.comment #{@comment.comment_text}
 time.comment_time = time_ago_in_words(@comment.created_at) +'前'
```
  • Ajax

    1790 questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

  • Ruby on Rails 4

    2643 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る