黒魔術なgem inherited_resources
Railsのコントローラーに RESTful の基本形コントーローラーメソッドがないのに、create, update, destroyできてる・・
黒魔術的なgem, inherited_resourcesが入っていないか確認する。
gem 'inherited_resources'
これが Gemfile に含まれていて、対象のコントローラーが inherit_resourcesを有効にしている場合、デフォルトの index, new, edit, show, create, update, destroy が省略できるようになっている。
有効にする方法
class ProjectsController < InheritedResources::Base end
または
class ProjectsController < ApplicationController inherit_resources end
対象のコントローラーが、ApplicationController以外を継承してる場合、親のクラスも調べる。 inherit_resources有効なClassを継承していても、やっぱり効いてくるので注意!
inherit_resources で更にアクションをカスタマイズしたい時
inherit_resourcesで追加されるアクションの基本動作はScaffoldの通り。
destroyは対象モデルを削除した後に、そのリソースのindex urlにリダイレクトする。みたいな感じ。
それらの基本動作を上書きしたい場合、 ! をつけたアクション名で呼び出す。
やり方はこんな感じ。
class ProjectsController < ApplicationController inherit_resources def show show! do |format| format.html { render "edit" } end end def destroy destroy! { root_url } end end
カスタマイズしているアクションの動作
- showのrenderするテンプレートをeditにしている
- destroyした後のリダイレクト先をリソースのindexではなく、アプリケーションのルートURLにしている
defaultsでデフォルト動作をフックする
class ProjectsController < ApplicationController inherit_resources defaults finder: :find_by_name end
findのidで探すところを、モデルの find_by_name で代替するように指定したりできちゃう。らしい。
注意点
このgemはもうあまり使われていないらしい。 元リポジトリのREADMEでも一番最初に Deprecation notice が書かれているので、今から新しく使うことはしないほうが良さげ。
I suggest developers to make use of Rails' respond_with feature alongside the responders gem as a replacement to Inherited Resources.
と書いてあるので、respond_with でフォーマットの指定ができるようになったので、標準の方を使ったほうが良い、らしい。
とはいえ、見かけたソースに 標準アクションがないのに、なんか動作してるけど!?という時に、原因を見つけるために知っておいた方が良い、くらいの位置づけっぽいです。