railsのroutesで指定するshallowではまった
shallowではまったネタを。
shallowとは
railsにはRESTfulなURLを複雑にしないためのshallowというオプションが存在する。詳しくはこちらを。
実際の指定
実際にはこう指定している。
namespace :admin do resources :accounts do resources :account_games, shallow: true end end
子リソースのidが決まっている場合はURLをネストする必要はないので大歓迎なのだが、_form.html.erbではまってしまった。
問題
form_forの引数でURLを決めるところで、newアクションを通そうとすると、editアクションでエラーになり、editアクションを通そうとするとnewでエラーとなる。。。なぜなら、newの時はURLに親リソースが含まれるが、editの時は親リソースが含まれないから。
rake routesでは以下のようになる。
new_admin_account_account_game GET /admin/accounts/:account_id/account_games/new(.:format) admin/account_games#new
edit_admin_account_game GET /admin/account_games/:id/edit(.:format) admin/account_games#edit
解決方法
結局、ifで分岐する以外に方法がわからなかったので_form.html.erbは以下のようにした。
<% if @account_game.id.nil? resource_info = [:admin, @account_game.account, @account_game] else resource_info = [:admin, @account_game] end %> <%= form_for(resource_info) do |f| %>
何かいい方法はないものか。