環境
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_with model: user
ログイン画面など、new→createだけを行い、edit→updateは行わない場合、Viewに入力した値をコントローラに受け渡すには、scopeパラメータを使います。scopeパラメータを使っても、ViewからcreateメソッドへはPOSTで転送されます。更に、paramsハッシュには、sessionというキーでViewに入力した値が全てセットされます。
例えば、Viewの入力項目のnameがpasswordである場合、コントローラの中で、params[:session][:password]とすると、passwordの値が取得できます。
form_with scope: :session
form_withのurlパラメータは省略しても、ちゃんと、指定のコントローラの中に入ってきてくれます。たぶんですが、Viewがあるフォルダ名とコントローラ名が同じ場合は、urlパラメータは省略しても問題ないようです。後々の可読性のために、明示的に指定しておきたい場合は、指定しても何ら問題はありません。
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
form_with url: login_path, scope: :session