form_withメソッドのアウトプット
HTMLではこのように実装していた
<form action="/posts" method="post">
<input type="text" name="コメント">
<input type="submit" value="投稿する">
</form>
action属性は送信URLを指定する際に書くが、
HTML5以降からは必須では無くなった。
コードを解析するとどこに情報が集約されているのか分かるので、
あまり好ましくはない。
そこでRailsのヘルパーメソッドを用いてHTMLを表示する
ヘルパーメソッド
rails5.1以降からはform_withメソッドを用いてフォームを追加する
それ以前まではform_tagやform_forを用いてフォームを追加していた。
あまり違いを気にしていなかったが、違いを今回調べてみました。
form_tagメソッド
関連するモデルがなく、データを保存する必要がない場合
<%= form_tag('/main, method: :post') do %>
<input type="text" name="penname">
<input type="submit">
<% end %>
form_forメソッド
関連するモデルがあり、データを保存する必要がある場合に用いる
<%= form_for(@user) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
ヘルパーメソッド内にブロック変数fを用いているのが分かる。
form_withでも見慣れた記述ですね。
form_withの記述
データを保存しない記述?!(この辺りがまだ曖昧です)
<%= form_with url: "/posts", method: :post, local: true do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
url: フォームの情報を送るリクエストのパス(投稿先)を指定。
method: httpメソッドを指定。初期値はpostなので、postメソッドの場合は省略可
local: ローカル送信を無効にするかどうか。trueにすると無効
データをモデルに保存する記述
<%= form_with(model: @user, local: true) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
model: モデルオプションで指定されたインスタンス変数の状態により、
リクエストを送るアクションを判断
アクションにより、paramsでデータを渡す必要がある
①ストロングパラメーター
- 意図しないデータの読み書きを防ぎ、受け取るパラメーターを制限する
②requireメソッド
- 送信されたパラメーターの情報を持つparamsが、使用できるメソッド
- パラメーターからどの情報を取得するのかを選択する。
③permitメソッド
- 取得したいキーを指定し、指定したキーと値のセットのみを取得する
①②③を踏まえた上での記述
private
def item_params
params.require(:item).permit(:name, :text, :category_id, :price, image)
end
itemモデルから商品名/説明/カテゴリー/値段/商品画像を取得
プライベートメソッドでClass外から呼び出さないように、可読性の向上を。
def create
item.create(item_params)
end
item_paramsというストロングパラメーターを定義し、
createアクションの引数に使用し、itemsテーブルへと保存できるようになりました。
newアクションで作成された既存のものをcreateアクションに渡してます。
私が今作成しているオリアプのupdateアクションにも既存のデータは渡されますね。
参考サイトを見るとインスタンス変数の中身からアクションを選別し、
自動で振り分けてくれる。なので、ビューファイルも同じもので出来る。
この二つが大きなメリットそうですね。
まだまだ細かいメソッドなどは把握しきれてないので、
オリジナルアプリに検証したいと思います。