LoginSignup
10
4

More than 3 years have passed since last update.

【Rails】ネストされたcontroller宛てのform_withの書き方

Last updated at Posted at 2019-05-29

namespaceでnestされたcontroller(Admin::Userなど)のアクション宛てformを
form_withで記述したい場合の雛形になります。

書き方

◆ new → create

new.html.erbのviewからAdmin::UsersControllercreateアクションへ送りたい場合、htmlレベルでは

<form action="/admin/users" method="post" >
  <input type="text" name="user[name]">
</form>

こうなっていてほしいが、form_withではどう記述すればよいか?

① model: を使う方法

model:@userを指定し、url: でpathを指定します。

new.html.erb
<%= form_with model: @user, url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

② model: を使わない方法

scope::userを指定し、 url:でpathを指定します。
scope: :userによってパラメーターのuser[]を生成するようです。

new.html.erb
<%= form_with scope: :user, url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

(ちなみに、scope: :userをなくすと)

new.html.erb
<%= form_with url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

↓htmlレベルでは

<form action="/admin/users" method="post" >
  <input type="text" name="name">
</form>

user[name]ではなく、nameになっています。

◆ edit → update

同様に、edit.html.erbからAdmin::UsersControllerupdateアクションへ送りたい場合、htmlレベルでは

<form action="/admin/users/3" method="post"><input type="hidden" name="_method" value="patch" />
  <input type="text" name="user[name]">
</form>

こんな感じになっていてほしいが、form_withではどう記述すればよいか?

① model: を使う方法

model:@userを指定し、url: でpathを指定します。

edit.html.erb
<%= form_with model: @user, url: admin_user_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

② model: を使わない方法

scope::userを指定し、 url:でpath、method::patchを指定します。

edit.html.erb
<%= form_with scope: :user, url: admin_user_path, method: :patch, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

(ちなみに、method: :patchをなくすと)

edit.html.erb
<%= form_with scope: :user, url: admin_user_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>

↓htmlレベルでは

<form action="/admin/users/3" method="post">
  <input type="text" name="user[name]">
</form>

<input type="hidden" name="_method" value="patch" />が無くなりました。
これにより「htmlメソッドはpatchという体裁で送っているよ」というメッセージが消えたので、railsサーバーはPOSTが届いたと認識します。(詳しくはこちら)
methodがPOST、pathがadmin_user_pathの組み合わせは存在しないので、Routing Errorになるはずです。

結論

form_withではmodel:を使えば空気を読んで自動翻訳くれるのでかなり楽。
しかし、nestされている状態とpathまでは空気読みきれないので、mode:url:のセットを使えばOK.

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4