フォーム作成時の理解で大事なところ

railsチュートリアルからかいつまんで抜粋

<%= form_for(@user) do |f| %>

.

.

.

<% end %>

が<form></form>にあたることをまず抑えとく

もう少し詳しく見ると、例えば

<form action="/users" class="new_user" id="new_user" method="post">

ここで大事なのはactionとmethod

classとid属性はアーキテクチャとしては基本的に無関係

actionとmethodは

/usersに対してHTTPのpostリクエスト送信するっていう意味

なんでform_forに@user渡しただけでこんな風になるかと言えば全てのRubyオブジェクトは自分のクラスを知っているのでRailsは@userのクラスがUserであると認識し、@userは新しいユーザーなのでpostメソッドを使ってフォームを構築すべきだと判断してくれるから、/usersへのPOSTリクエストはcreateアクションで処理される。チュートリアルでは結局post '/signup', to:'user#create'って感じでルーティングしてあったからform_forにurl:signup_path渡してたけどね。

 

続いて中身の話に移る

<%=f.text_field :name %>とか中にまぁ色々書くんだけど、

もちろんこれはinputタグにあたる。fだけどinputね。

<input id="user_name" name="user[name]" type="text"/>

ここで大事なのはname属性

Railsはnameの値を使って、初期化したハッシュを(params変数経由で)構成する。

このname属性のハッシュ、ここではuserハッシュが保存されてparamsに入って送られる。

なのでコントローラー側ではcreateアクションで

@user = User.new(params[:user])という処理をするがこれは

@user = User.new(name:"value", email:"value@value", password:"value",password_confirmation:"value")

とほぼ同じだということ。

 

昔のRailsではこのままでも動いたが、脆弱性が発見されてからはストロングパラメーターでrequireしてあげないとエラーが出るようになったのでそこは注意。ただデータの流れとしてはinputのnameでuserハッシュがparamsに入って送られてくるのでcreateアクションでparamsからuserというキーを使って送られてきた属性の値を入手するっていう考えでいいと思う。

 

ちなみにhtmlやデバッグだとハッシュのkeyは文字列で表示されるけどRailsはシンボルとしてコントローラーに渡してくるからそこは注意

 

なので結果的には

@user = User.new(params[:user]) とは書かずに定義したprivateメソッドを引数にとる

@user = User.new(user_params)みたいになる

 ストロングパラメータでは今までの例だと

private

  def user_params

    params.require(:user).permit(:name, :email, :password, :password_confirmation)

  end

という記述になる

 

privateは閉じなくてOK