LoginSignup
2
2

More than 5 years have passed since last update.

先に記入させて後からログインさせる(Gradual Engagement)の話

Last updated at Posted at 2017-05-17
1 / 18

渋谷.rb[:20170517]のLT資料です。
スライドモードで見ることを想定しています。


今日話すこと

  • 先に記入させて後からログインさせる(Gradual Engagement)の話
  • 設計の話でRubyあんま関係ない、ごめん :tired_face:
  • Railsの実装例も紹介
  • 実例

Who

  • kaiba
  • 最近は RailsとiOS
  • 無法地帯改善! テストも書き始めた :muscle:

とあるウェブサービスで…

  1. ほほう、おもしろそうだな。ポチ。
  2. 会員登録が必要です
  3. めんど、やめよ

そこでこうしたい

  1. ほほう、おもしろそうだな。ポチ。
  2. どうぞ! 使ってください!
  3. それ! なるほど、こういうことができるのか! 使ってみよう!
  4. 会員登録が必要です
  5. しょうがないにゃあ、いいよ :cat:
  6. WIN! WIN!

Gradual Engagement

日本語にすると段階的な関与

  • 何ができるのかを最初に見せることができる
  • そのために会員登録が必要なことも理解しやすい
  • 会員登録してもらいやすい!

実装を考える :thinking:

  • 今までログインありきだったのをログインなしで使えるようにしないといけない
  • 入力情報を input type=hidden でパラメータを引きずり回して、会員登録時にどーん!して紐付けてやる…?
  • つらい
  • やめない…?

image.png


そこで、こうやって、こうじゃ

  • Guestsテーブルを作成
  • Guestsテーブルはtokenを持ち、cookieにも保持させる
  • Guestsテーブルと作成したデータ(今回はPosts)を紐付ける
  • 会員登録したらUserテーブルと作成したデータを紐付けてやる

image.png


注釈

※ 最初からこの仕様がわかっているなら Posts と Users/Guests間に関連テーブルを作るとかしたほうが美しい/使いやすい


Railsの例

  • こんなかんじ? を書いただけで動く補償はないです :smiling_imp:
  • 処理の流れを追うためにベタッと書いてます。

Posts作成時に認証を不要にして、Guestと紐付ける

# posts_controller.rb
skip_before_action :authenticate_user!
def create
  session[:guest_token] ||= SecureRandom.uuid
  guest = Guest.where(token: session[:guest_token]).first_or_create
  Post.create(msg: msg, guest: guest)
end

会員登録後にPostと紐付ける

# users_controller.rb
def create
  user = User.create(params)
  guest = Guest.find_by(token: session[:guest_token])
  Post.where(guest: guest).update(user: user)
end

やった!


おわり

  • せっかくなので未リリースの機能を実演させてください :bow:

発表後にいただいた意見

not nullにできて、Railsの機能で使いやすい。
ただpreloadするときに困るケースがある。

2
2
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
2
2