起きていること
タイトルの通り、Rails6にてform_withでレコードをcreateする処理のバリデーションエラーをSJRで返すように実装したのだが、'text/html'フォーマットがないぞと怒られた
EventsController#create is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []
SJRってrailsがよしなに空気読んでJavaScript返してくれるという認識なんですが違うのでしょうか?
webpackerとかの絡みもあるのかなーと思ってるのですがあまり仕組みを理解できていないので困っております
関係ありそうなソースコードは以下に挙げてみましたがその他に必要そうなものがあればコメントで指示していただけるとありがといです
よろしくお願いします
関連コード
ruby
1# views/events/new.html.haml 2 3- now = Time.zone.now 4 5%h1.mt-2 イベント作成 6 7= form_with(model: @event, class: 'form_horizontal') do |f| 8 #errors 9 .form-group 10 = f.label :name 11 = f.text_field :name, class: 'form-control' 12 .form-group 13 = f.label :place 14 = f.text_field :place, class: 'form-control' 15 .form-group 16 = f.label :start_at 17 %div 18 = f.datetime_select :start_at, start_year: now.year, end_year: now.year + 1 19 .form-group 20 = f.label :end_at 21 %div 22 = f.datetime_select :end_at, start_year: now.year, end_year: now.year + 1 23 .form-group 24 = f.label :content 25 = f.text_area :content, class: 'form-control', row: 10 26 = f.submit class: 'btn btn-primary'
ruby
1# /views/application/_errors.html.haml 2.alert.alert-danger 3 %ul.mb-0 4 - errors.full_messages.each do |message| 5 %li= message
ruby
1# /views/events/create.js.erb 2document.getElementById("errors").innerHTML = "<%= j render("errors", errors: @event.errors) %>"
ruby
1# /views/layouts/application.html.haml 2!!! 3%html 4 %head 5 %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/ 6 %title AwesomeEvents 7 -# %meta{:content => "width=device-width,initial-scale=1", :name => "viewport"}/ 8 = csrf_meta_tags 9 = csp_meta_tag 10 = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' 11 = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' 12 %body 13 %header.navbar.navbar-expand-sm.navbar-light.bg-light 14 .container 15 = link_to 'AwesomeEvents', root_path, class: 'navbar-brand' 16 %ul.navbar-nav 17 %li.nav-item 18 = link_to('イベントを作る', new_event_path, {class: 'nav-link'}) 19 - if logged_in? 20 %li.nav-item 21 = link_to 'ログアウト', logout_path , class: 'nav-link', method: :delete 22 - else 23 %li.nav-item 24 = link_to 'GitHubでログイン', '/auth/github', class: 'nav-link', method: :post 25 .container 26 - if flash.notice 27 .alert.alert-success 28 = flash.notice 29 - if flash.alert 30 .alert.alert-danger 31 = flash.alert 32 = yield 33
ruby
1# /controllers/events_controller.rb 2class EventsController < ApplicationController 3 def new 4 @event = current_user.created_events.build 5 end 6 7 def create 8 @event = current_user.created_events.build(event_params) 9 if @event.save 10 redirect_to @event, notice: '作成しました' 11 end 12 end 13 14 private 15 16 def event_params 17 params.require(:event).permit( 18 :name, :place, :content, :start_at, :end_at 19 ) 20 end 21end
ruby
1# /models/event.rb 2class Event < ApplicationRecord 3 validates :name, presence: true, length: {maximum: 50} 4 validates :place, presence: true, length: {maximum: 100} 5 validates :content, presence: true, length: {maximum: 2000} 6 validates :start_at, presence: true 7 validates :end_at, presence: true 8 validate :start_at_should_be_before_end_at 9 10 private 11 12 def start_at_should_be_before_end_at 13 return unless start_at && end_at # start_atとend_atが両方nullならreturn 14 15 if start_at >= end_at 16 errors.add(:start_at, 'は終了時間よりも前に設定してください') 17 end 18 end 19 20end 21
試したこと
formatを*/*
に指定するとtext/javascript
返すがそのままブラウザに平文がレンダリングされた
ruby
1= form_with(model: @event, class: 'form_horizontal', format: */*) do |f|
あなたの回答
tips
プレビュー