ポートフォリオアプリを作っています。
作品の一覧と各作品の詳細は誰でも見られるようにしようと思いますが、作品の投稿と編集は管理者だけができるようにしたいと思います。
管理者ユーザーの作成は、過去の自分のこちらの記事を読んで実装できたのですが、
[【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]][1]
[1]:https://qiita.com/tanutanu/items/7ce8826615f1af605164
その後、管理者ユーザーの投稿機能をつけ、submitボタンを押したときに、以下のようなエラーが出ました。
何、/works
にPOSTメソッドでつながるルーティングがないそうです。
確かに、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ドキュメント完全翻訳][2]
[2]:https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502
こちらの記事によると、「ルーティングをadmin_post_urlのように名前空間化する場合は以下のようにします。」とのこと。
<%= form_with(model: [ :admin, @post ]) do |form| %>
...
<% end %>
こちらを参考に、hamlに合わせて、以下のように記述を変更しました。
第二引数にurlを追記しています。
= form_with model: [ :admin, @work ], local: true do |f|
・・・そしたら、、、動いた!!
以上、簡単ですが、form_withのデフォルトの送信先を変更する方法でした^^