親クラスとしてform_forしたい。

class Curry < ActiveRecord::Base; end
class SeafoodCurry < Curry; end
class VegetableCurry < Curry; end

という関係のクラスがあって、

map.resources :curries

という定義がしてある場合の話。
すべてCurryとして編集したかったのだけれど、

<% form_for(@curry) do |f| %>

のところで詰まってしまった。
[13:05 追記] @curryはSeafoodCurryやVegetableCurryのインスタンスです。
こう書いたら、

undefined method `seafood_curry_path' for #<ActionView::Base:0xb7149864>

だとか

undefined method `vegetable_curry_path' for #<ActionView::Base:0xb72efdd0>

のように、子クラスでルートをつくろうとしているらしく、おこられてしまう。ただインスタンスを投げているだけだからこれはしかたない。

で、問題はここから。form_forを呼ぶときにアップキャストすればいいだけだと思ったのだけれど、そもそもキャストってないじゃないか、と。
ドキュメントを読んだら

Module: ActionView::Helpers::FormHelper

Resource-oriented style

<% form_for @post do |f| %>

<% form_for :post, @post, :url => post_path(@post), :html => { :method => :put, :class => "edit_post", :id => "edit_post_45" } do |f| %>

となるらしいのでこれをベタ書きで対応したのだけれど、いかんせん長すぎる。
なんかスマートな方法があるんじゃないかと思うのだけれど、どこかで道を間違ったのかなぁ。

コメント

  1. komagata より:

    @curryにはCurryのインスタンスが入ってるんすか?

  2. yoshuki より:

    おーそれ書いてなかったですね、それぞれSeafoodCurryやVegetableCurryのインスタンスが入ってます。

タイトルとURLをコピーしました