railsのform_forヘルパーは以下のように使いますよね
= form_for(@post) do |f|
= f.label :title
= f.text_field :title
こう書いておけば出力されるhtmlは
大体こんな感じになるかと。
でrailsの便利なところはform_forに渡してるモデルオブジェクトが、空なのかDBのレコードから生成されたのかを判別して、actionの属性値をよしなに変更してくれるところですよね。
つまりroutesに
resouces :posts do
end
と書いてあれば 新規作成時は action="/posts"
だし編集画面では action="/posts/1"
になると。
でもこれが namespace 付きのroutesだとうまく行かなくて困りました。
管理画面を作る場合とかだと /admin/posts にしたくて
namespace :admin do
resources :posts do
end
end
と定義しておいて、form_for で生成したフォームを上記のままにしておくと、undefined method `posts_path' と怒られてしまう。
一瞬下記のやり方?とか思ったんですがrailsに限ってそんなことないよね…
= form_for params[:action] == 'new' ? admin_posts_path : edit_admin_post_path(@post) do |f|
= f.label :title
= f.text_field :title
ぐぐったら出てきた。
Rails Routes Namespaces and form_for - Stack Overflow
= form_for [:admin, @post] do |f|...
だってさ!
配列で指定するんですか。なるほどこれで admin_posts_path と edit_admin_post_path を切り替えてくれるんですね。
ということは…やってみた。
namespace :hoge do
namespace :fuga do
namespace :foo do
namespace :bar do
resources :hellos do
end
end
end
end
end
= form_for [:hoge, :fuga, :foo, :bar, @hello], do |f|
= f.label :name
= f.text_field :name
成功\(^o^)/