LoginSignup
13
14

More than 5 years have passed since last update.

Railsのセッションフォームとユーザー登録フォームの違い

Last updated at Posted at 2018-06-15

はじめに

Rails チュートリアルなどで、Railsの勉強をしていてフォームの実装をしていた時に、ユーザー登録などのフォームと、ログインに使うフォームでコードが違っていたので、何が違うんだろうと調べていたら勉強になったので、まとめておきます。

環境

この記事では以下の環境(2018年6月15日時点)で動作確認できました。

  • Ruby: 2.4.1
  • Rails: 5.0.7

主な違い

セッションフォームとユーザー登録フォームの主な違いは、セッションにはSessionモデルというものが無いため、例えば、ユーザー登録のフォーム(View)でよく見る<%= form_for(@user) do |f| %>で始まるフォームにある@userのようなインスタンス変数に相当するものが無いことだと思います。それに対して、セッションフォームの場合、form_forViewに関するヘルパーにリソースの名前とそれに対応するURLを明示する必要があります。

まず前提として、HTTPはステートレスな通信プロトコルなので、一度の送受信がわかったら(例えばページを遷移したら)、前に持っていた情報(状態(ステート))は失われます。例えばログインに関してだと、これでは困りますよね?だって、ページ遷移するたびにログインしなきゃいけないのですから。Amazonで欲しい商品をカートに入れて違う商品ページに遷移したら、カートに入れた商品がカートから無くなってしまいます。だけど実際はそうなっていないですよね?それは、サーバにセッションという技術が、ブラウザにはクッキーという技術が用いられているからです。

そして、これは推測なのですが、なぜログイン情報をセッションでも持つのかについては、例えばログイン情報やAmazonのカートの中に入っている商品情報は、DBに格納するような永久的に保存する情報では無いからというのと、何度かページ遷移する(アクセス頻度が高い)ことを考えると、いちいちDB保存するのはパフォーマンスが悪いからだと私は考えてます(間違ってたらご指摘ください)。

ユーザー登録のフォーム

ユーザー登録のフォーム(View)は以下のようになってることが多いと思います。(インスタンス変数名(@user)は仮)


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

@userは、Controllernewアクションで用意して(と仮定して)フォームを作成することを明示しています。ここで入ったデータが、createへ送られます。フォームの内容はparams[:user]に入っていきます。

Rails では、form_for(@user)と書くと、フォームに入ったデータのアクションは/usersというURLへのPOSTだと、自動的に判定してくれます。しかし、セッションの場合はリソースの名前とそれに対応するURLを指定する必要があります。

セッションフォーム

セッションフォーム(View)は以下のようになってることが多いと思います。

<%= form_for(:session, url: login_path) do |f| %>
...
<% end %>

セッションフォームの場合、form_forViewに関するヘルパーにリソースの名前とそれに対応するURLを具体的に指定する必要があります。

  • リソース名::session
  • 対応するURL:login_path(POST)

Railsにおけるリソースとは、コントローラが扱う対象に名前をつけたものです。リソースには、モデルや、セッション、画像などがあります。今回は、セッションを扱うよと明示的に宣言したことになります。(実は、名前(今回なら:session)は、なんでもいいみたいです。ならどうやって、セッションだと判定してるのだろうか。。)

セッションフォームなので、例えば、この後、newのページから送信されたフォーム(仮にメアドやパスワードの情報があるとする)を処理するcreateアクションでは

email = params[:session][:email]
password = params[:session][:password]

こんなのが出てくると思います。

params[:session][:email]

これはフォーム(new)から送信されたメールアドレスです。

params[:session][:password]

これはフォーム(new)から送信されたパスワードです。

こうすることで、createアクションでは、ログインに必要な情報をparamsハッシュから簡単に取り出せます。


以上です!

この記事を読んだ方に

この記事を読んで、誤っている箇所をみつけたり、追記した方がいい内容などありましたら、編集リクエストやコメント欄で指摘していただけると助かります。

参考

13
14
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
13
14