form_withでデフォルトのデータ送信先を変更する[Rails]


ポートフォリオアプリを作っています。
作品の一覧と各作品の詳細は誰でも見られるようにしようと思いますが、作品の投稿と編集は管理者だけができるようにしたいと思います。

管理者ユーザーの作成は、過去の自分のこちらの記事を読んで実装できたのですが、

【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]

その後、管理者ユーザーの投稿機能をつけ、submitボタンを押したときに、以下のようなエラーが出ました。

何、/worksPOSTメソッドでつながるルーティングがないそうです。
確かに、rake routesで確認してみると、管理者ユーザーが画像を投稿するときのルーティングはadmin_works_pathで、URLも /admin/worksです。

      works GET    /works(.:format)  works#index                                                                    
       work GET    /works/:id(.:format)  works#show                                                                   
admin_works GET    /admin/works(.:format)  admin/works#index                                                                  
            POST   /admin/works(.:format)  admin/works#create                                                                  

ところが、form_withの記述を見直してみても、以下の通り。

= form_with model: @work, local: true do |f|
 # 中略
 =f.submit

そうでした、form_withは投稿先のメソッドに応じて、よしなにURLを変更してくれるのでした。ちなみに、これでPOST(create)にもPATCH(edit)にも対応してくれます。わー、便利。

ですが、今回はこちらのデフォルトのURLを変更しなければいけません。
form_withのAPIドキュメントを翻訳してくれた方がいたので、こちらの記事を参照しました。

Rails 5.1〜: ‘form_with’ APIドキュメント完全翻訳

こちらの記事によると、「ルーティングをadmin_post_urlのように名前空間化する場合は以下のようにします。」とのこと。

<%= form_with(model: [ :admin, @post ]) do |form| %>
  ...
<% end %>

こちらを参考に、hamlに合わせて、以下のように記述を変更しました。
第二引数にurlを追記しています。

= form_with model: [ :admin, @work ], local: true do |f|

・・・そしたら、、、動いた!!
以上、簡単ですが、form_withのデフォルトの送信先を変更する方法でした^^