読者です 読者をやめる 読者になる 読者になる

まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

黒魔術なgem inherited_resources

Railsのコントローラーに RESTful の基本形コントーローラーメソッドがないのに、create, update, destroyできてる・・

asciicasts.com

github.com

黒魔術的な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 でフォーマットの指定ができるようになったので、標準の方を使ったほうが良い、らしい。

とはいえ、見かけたソースに 標準アクションがないのに、なんか動作してるけど!?という時に、原因を見つけるために知っておいた方が良い、くらいの位置づけっぽいです。