5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

form_withのscopeは何をしているのか

Posted at

環境

Rails 5.2

内容

form_withのパラメータのscopeはどのような動きをしているのか確認してみました。結論を言うと、scopeを指定すると、ViewからControllerにPOSTするとき、Viewに入力した値が、paramsハッシュにセットされます。

更新処理をするとき、form_withのパラメータには、通常、modelがよく使われます。下記の書き方だけで、newのときは画面に入力した値をcreateメソッドにPOSTで転送し、editのときはupdateメソッドにPUTで転送します。また、editのときは、idがparamsハッシュにセットされるため、コントローラの中でparams[:id]とすると、idの値を取得することができます。

HTTPのどのメソッドを使って転送し、どのコントローラのどこのメソッドに入ってくれるかの判断は、Railsが裏側で自動的に行ってくれます。この辺が、Railsの便利なところでもあり、また、初学者が難しいと感じるところでもあろうかと思います。

_form.html.slim
form_with model: user

ログイン画面など、new→createだけを行い、edit→updateは行わない場合、Viewに入力した値をコントローラに受け渡すには、scopeパラメータを使います。scopeパラメータを使っても、ViewからcreateメソッドへはPOSTで転送されます。更に、paramsハッシュには、sessionというキーでViewに入力した値が全てセットされます。

例えば、Viewの入力項目のnameがpasswordである場合、コントローラの中で、params[:session][:password]とすると、passwordの値が取得できます。

new.html.slim
form_with scope: :session

form_withのurlパラメータは省略しても、ちゃんと、指定のコントローラの中に入ってきてくれます。たぶんですが、Viewがあるフォルダ名とコントローラ名が同じ場合は、urlパラメータは省略しても問題ないようです。後々の可読性のために、明示的に指定しておきたい場合は、指定しても何ら問題はありません。

routes.rb
get  '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
new.html.slim
form_with url: login_path, scope: :session
5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?