jQueryUIのsortableで並び替えが保存されない

Rails5.2.1

初の自作アプリとしてタスク管理アプリケーションを作成すべくこの一週間奮闘してきまして、本日とりあえずの完成に至りました。

Taskの並び替えをドラッグ&ドロップで実現すべくjQueryUIの導入を目指してドン詰まったのが前回の記事でしたが、その後並び替えたTaskの順番が保存されないという問題が新たに浮上しまして、その解決までの道のりを記しておきます。

エラー内容

Started PUT "/users/1/tasks/51/sort" for 157.107.100.245 at 2018-08-30 10:33:07 +0000
Cannot render console from 157.107.100.245! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by TasksController#sort as JSON
  Parameters: {"task"=>{"row_order_position"=>"1"}, "user_id"=>"1", "task_id"=>"51"}
★Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 0ms (ActiveRecord: 0.0ms)

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.1/lib/action_controller/metal/request_forgery_protection.rb:211:in `handle_unverified_request'
vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.1/lib/action_controller/metal/request_forgery_protection.rb:243:in `handle_unverified_request'
vendor/bundle/ruby/2.4.0/gems/devise-4.5.0/lib/devise/controllers/helpers.rb:255:in `handle_unverified_request'(こんな感じのがたくさん

エラー部分抜粋

Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 0ms (ActiveRecord: 0.0ms)

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

これに関してはこちらの記事がとても参考になりました。

Rails4のCSRF対策で「Can't verify CSRF token authenticity」エラー

RailsCSRF対策によって発生しているエラーですが、動き自体は正常なものなので、

class TasksController < ApplicationController
 protect_from_forgery except: :sort
end

と記述することでsortアクションを例外に指定します。


これで解決したと思いきや、次のエラーが

Started PUT "/users/1/tasks/52/sort" for 157.107.100.245 at 2018-08-30 11:16:00 +0000
略
 [1m[35m (5.4ms)[0m  [1m[36mcommit transaction[0m
  ↳ app/controllers/tasks_controller.rb:60
Completed 500 Internal Server Error in 32ms (ActiveRecord: 7.6ms)
  
ActionView::MissingTemplate (Missing template tasks/sort, application/sort with {:locale=>[:en], :formats=>[:json, :js, :html, :text, :js, :css, :ics, :csv, :vcf, :vtt, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :mp3, :ogg, :m4a, :webm, :mp4, :otf, :ttf, :woff, :woff2, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :slim, :coffee, :jbuilder]}. Searched in:
  * "/home/ec2-user/environment/TodoApp3/app/views"
  * "/home/ec2-user/environment/TodoApp3/vendor/bundle/ruby/2.4.0/gems/devise-4.5.0/app/views"
):
  
app/controllers/tasks_controller.rb:61:in `sort'

ActionView::MissingTemplate (Missing template tasks/sort, application/sort with
という部分から「tasksコントローラのsortアクションで描写するviewがないよ!」
という意味だと読み取れます。
最後の行にあるapp/controllers/tasks_controller.rb:61:in `sort'に従って61行目を確認すると……

  def sort
    @user = User.find(params[:user_id])    
    task = Task.find(params[:task_id])
    task.update(task_params)
⇛ render nothing: true
  end

ここが良くないようです。

調べてみるとどうやら、

render nothing: true はRails5から使えなくなったので変わりに

render body: nil あるいは head :ok を使う

ということだったようです。

感想

Rails4を想定して書かれた記事を参考にしていたばかりに、思わぬところで時間を取られてしまいました。
やり方を調べればいくらでも記事は出てきますが、情報が古い可能性があるということ、プログラミングで使うものは日々アップデートされるということをしっかり理解していないと今回のような事態になってしまいます。なんでもコピペではダメですね。