Rails で既存のモデルから view を自動(再)生成する

rails generate scaffold で生成した view が migration によるテーブルのカラムの変更に追随してなかったから更新しましょうということになったのですが、量がそれなりにあって手作業でやると面倒なので rails generate しなおしたのから切り貼りしたらいいじゃない、と思って調べてみたのですが、どうもそういうのがみつからなかったのでこんなふうにしてみました。ちなみに rails generate view というような view だけ作るのはないんですね。

model, = ARGV

script = <<-END
attrs = #{model}.columns.map{|col| [ col.name, col.type ] }
system("bundle exec rails generate scaffold #{model} \#{attrs.map{|field, type| "\#{field}:\#{type}" }.join(" ")} -f")
system("git checkout -- app/models app/controllers app/assets db/migrate config/routes.rb spec/")
system("git clean -f db/migrate")
END

system("bundle exec rails runner '#{script}'")

こんなふうにモデルのクラス名を指定して使います。

% ruby regenerate_view.rb FooModel

一応解説しておくと rails runner を使って既存の ActiveRecord のモデルからカラム情報を取り出して rails generate scaffold に渡すフィールド情報の引数を作って、rails generate scaffold してから view 以外のところを元に戻してます。あとは差分をみながら必要なところは残しつつうまいことやります。

絶対こういうの誰かやってると思うんですけど、みあたらないということはなにかすごく筋の悪いことをしているんじゃないかなーと思う Rails はじめて 2ヶ月の新米 Rails プログラマです。