前提・実現したいこと
今jQueryのAjaxを使い、レビューの投稿画面を実装しています。
フォームの中にレビューを書き、送信ボタンを押すとその内容が画面に非同期で表示されるようにしたいです。
レビュー投稿画面はreviews/show.html.hamlで設定しています。
そこでreview.jsのファイルにAjaxを記述したのですが、
フォームの中に文字を入力して送信ボタンを押すと、エラーが出てきてしまいました。
解決方法を教えていただけますと幸いです。
発生している問題・エラーメッセージ
ActionController::UnknownFormat in ReviewsController#create ActionController::UnknownFormat
json形式でコントローラーにデータを送りたいのですが、
ターミナルのログにはHTMLとして送信されたと書かれてしまっています。
該当のソースコード
▼app/assets/javascripts/review.js
ruby
1$(function(){ 2 function buildHTML(review){ 3 let html = `<div class="Message_box"> 4 <img class="Message_box__User_image" src="/attachments/1aab43602b1af4375a5bdc1eb3ad4ab5756602bd/store/${review.profile_image}/profile_image"> 5 <div class="Message_box__Content"> 6 <a class="Link Text Message_box__Content__Name" href="/posts_g/8">${review.user_name}</a> 7 <div class="Message_box__Text Text"> 8 ${review.content} 9 </div> 10 </div> 11 </div>` 12 return html; 13 } 14 $('.New_r').on('submit', function(e){ 15 e.preventDefault(); 16 let formData = new FormData(this); 17 let url = $(this).attr('action'); 18 $.ajax({ 19 url: url, 20 type: 'POST', 21 data: formData, 22 dataType: 'json', 23 format: 'json', 24 processData: false, 25 contentType: false 26 }) 27 .done(function(data){ 28 let html = buildHTML(data); 29 $('.Reviews').append(html); 30 $('.Textbox_r').val(''); 31 $('.Submit_r').prop('disabled', false); 32 }) 33 .fail(function() { 34 console.log('error'); 35 }); 36 }) 37})
▼app/controllers/reviews_controller.rb
ruby
1class ReviewsController < ApplicationController 2 3 def index 4 @user = User.find(params[:user_id]) 5 end 6 7 def create 8 @user = User.find(params[:user_id]) 9 @review = @user.reviews.new(review_params) 10 if @review.save 11 respond_to do |format| 12 format.json 13 end 14 else 15 @reviews = @user.reviews.includes(:user) 16 render :index 17 end 18 end 19 20 private 21 22 def review_params 23 params.require(:review).permit(:content).merge(user_id: current_user.id) 24 end 25 26end
▼app/views/reviews/show.html.haml
ruby
1.Header_r 2 .Title_r 3 = "#{@user.name}さんのレビュー" 4 .Main__content 5 .Wrapper_r 6 .Reviews 7 = render "review" 8 .Main__form 9 .Wrapper_r 10 = form_with model: [@user, @review], html: {class: "New_r"}, local: true do |f| 11 .Main__form__contents 12 .Main__form__contents__input 13 = f.text_field :content, class: 'Main__form__contents__input__text Textbox_r' 14 = f.submit '送信', class: 'Main__form__contents__btn Submit_r'
▼app/views/reviews/create.json.jbuilder
ruby
1json.content @review.content 2json.user_id @review.user.id 3json.user_name @review.user.name 4json.profile_image @review.user.profile_image_id
▼routes.rb
ruby
1 resources :users do 2 resources :reviews, only: [:index, :create] 3 end
試したこと
以下の内容を確認したところ、間違いは見つかりませんでした。
・AjaxのdataTypeに間違いがないか?
・create.json.jbuilderがちゃんと対応するコントローラー名のディレクトリに入っていて、アクション名と一致するファイル名になっているか?
補足情報(FW/ツールのバージョンなど)
バージョンは、Ruby 2.6.5、Rails 6.0.3.2です。
回答2件
あなたの回答
tips
プレビュー