私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

railsのroutesで指定するshallowではまった

shallowではまったネタを。

shallowとは

railsにはRESTfulなURLを複雑にしないためのshallowというオプションが存在する。詳しくはこちらを。

railsguides.jp

実際の指定

実際にはこう指定している。

  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| %>

何かいい方法はないものか。