レールに乗っからなくて痛い目を見た話
半日潰した。
何がしたかったか
なんてことはない、RESTfulなルーティングの普通の入力フォームを作りたかっただけだ。
# config/route.rb resource :entry
# app/controller/entry_controller.rb class EntryController < ApplicationController def index @entries = Entry.page(params[:page]).per(20) end def create @entry = Entry.new(params[:entry]) @entry.save! redirect_to :action => :index end def new @entry = Entry.new end end
# app/view/entry/new.html.haml = render 'form', :entry => @entry
# app/view/entry/_form.html.haml = form_for entry do |f| = f.text_field :title = f.text_area :value = f.submit 'save'
しかしこれが動かない
undefined method `entries_path'
は?(威圧
resource :entry
なんだからentries_path
とかあるわけないじゃん、entry_path
を呼べよそこは。
みたいにキレ気味でデバッグ開始。
無駄な努力スタート
ビューとかの設定には問題はないだろうという謎の自信があったので、とりあえずRails本体のコードを追っていった。
# lib/action_dispatch/routing/polymorphic_routes.rb:106 inflection = if options[:action] && options[:action].to_s == "new" args.pop :singular
ほむほむ、つまり options[:action]
に"new"
を渡してやれば単数形にしてくれるのか。
が、しかしこの方法は使えなかった。
なんか途中でoptions
の値が消されてここまで届かないらしい。
それはそれでRailsのバグっぽい気がしたけど、それはいったん放置して別の方法を探る。
うむむ。
ググる
やはりGoogle先生は優秀だった。
Simple Rails form: undefined method `categories_path' - Stack Overflow
要するに
( ◠‿◠ )☛ 貴様のやり方は Rails-way ではない
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂ うわあああああ
ということ。
リソースベースルーティングをする際は基本的に複数形にしなきゃいけないのか。
--- a/config/routes.rb +++ b/config/routes.rb - resource :entry + resource :entries, :path => :entry
こうして、あとはコントローラ名とかビューのディレクトリ名とかを適切に書き換えてやったら、動いた。
反省
ちゃんと設定見直したらすぐわかったよねこれ?(汗
まだまだデバッグ下手くそやな。
以上、 Rails使ってんだからちゃんとレールに乗っかれやコラ というお話。