未だ定まらないいいやり方。
現時点の私が良いと思っているRailsの使い方をメモる。
例
pokemonアプリ。
- monsters(ポケットモンスター)
- moves(技)
nested resourcesのcontrollerの置き場所
そのリソースに対する基本的なコントローラーであり、アプリに複数存在しない場合
例
# routes.rb
resources :monsters do
resources :moves
end
- app/controllers/monsters_controller.rb
- app/controllers/moves_controller.rb
結論
app/controller/
直下。
同一リソースに対するコントローラーが、アプリに複数ある場合
例
全技リストと、特定のポケモンが覚える技。
# routes.rb
resources :monsters do
scope module: :monsters do
resources :moves
end
end
resources :moves
- app/controllers/monsters_controller.rb
- app/controllers/monsters/moves_controller.rb
- app/controllers/moves_controller.rb
結論
routingに合わせたファイル配置にするべき
- 規則が単純で追いやすい
- CRUDの処理結果の遷移先やら取得方法やらを頑張って書き分けなくてよい(一つのコントローラーに詰め込んだ場合と比べて)
- monsterをfindする処理を
app/controllers/monsters/base_controller.rb
に共通化する余地がある その他、DRYにしたいならconcernsにまとめれば良い
URL規則が変わったらいちいち引っ越すのがめんどくさそう
共通部分がconcernsに追い出せるとは言え、2つのActionができることが気に入らない気もする
asset/javascriptsと同折り合いをつける
標準のgeneratorはviewと同じ配置ルールでjsのテンプレートを配置するくせに、globalに読み込むという地雷。
Turbolinkを使う(全javascriptを一つにまとめる)
そんなにネイティブで画面遷移がしたくないならReactとか使えばいいじゃんと思う。
でもscaffoldに逆らわないことはrailsのレールに一番乗れているということでもある。
そもそも、ページ固有のjsなんて必要なのか。
globalで全jsロジックが読まれているのがそんなに嫌なのか。
cssだと普通にやっているのに。
cssと同じように、特定ページ固有のものは、id名なりclass名なりのnamespaceに気を使って、自動的に読み込まれればいいのではないか。
Turbolinkを使わない(個別jsが読み込まれることもじさない)
まだ悩んでいるところ。一応妄想として、こんな感じにならないかなという案。
例
# app/assets/javascripts/application.js
- require_tree .
# app/views/layouts/layout.html.erb
+ <%= yield :partial_javascripts %>
# app/views/monsters/new.html.erb
+ <%= content_for :partial_javascripts do %>
+ <%= javascript_include_tag 'new.js' %>
+ <% end %>
# app/assets/javascripts/monsters/new.js
+ monsters#newでの固有の処理
- bodyタグにcontrollerとactionのidを割り振って、条件分岐させるより全然いいと思う
- わざわざviewでincludeするのがダサい、どっかでrenderするviewを取得できればよいのに(controller-actionではなく)
- parcial_viewはどうするの
- 考え中。parcial_viewが複数回呼ばれるケースに対応する必要がある
Reactなどを使う
すべて解決では?
railsサーバーはAPIに徹して、フロントエンドサーバーを別に立てるという手法を聞くけど、もうrails-coreにwebpackerが入ったのだし、別にサーバー建てなくてもいいと思うんだ。
おわりに
どうすれば幸せになれるんだ!