ほとラボ

It works!

レールに乗っからなくて痛い目を見た話

半日潰した。

何がしたかったか

なんてことはない、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使ってんだからちゃんとレールに乗っかれやコラ というお話。