change how to register your partner
Closed this issue · 12 comments
ユーザーにLINEみたいに一意に決まってるID持たせて、そのIDでパートナーを検索
→存在しない場合はメールで招待
→パートナーが登録するまでお待ちください。
現状のパートナー登録画面に招待機能を追加する形で対応しようと思います。
メールアドレスがユニークなので、それを利用しようかと思っていますが、「ユーザを一意に特定するID」を新たに追加した方がいいでしょうか?
招待機能ということは、メールを送るってことですよね?
まだメーラーを導入してないから、その環境を作るってなると大変。(ただ、無料のものがあるなら導入したい)
僕はメールアドレスはタイピングが大変だからと思って、IDを持たせようと思ったけど、
この場合ってメールアドレスを使ったほうがいいような気がしてきた。
仮にユーザーID作っても、その他に使いようないしね。
なんか中途半端にアサインしてしまって申し訳ない。
ただ、現状だと、パートナーをメールアドレスで探してあったら、即登録!になってるから変えたいと思いました。
確認画面とかをかますのが自然なのかな?
メールアドレス検索 -> 確認 -> 招待完了 という感じでしょうか。
招待はサイト内で完結させてもいいかもですね。
メールアドレス検索 -> 確認 -> 招待完了 という感じでしょうか。
そういう感じです。
メーラー導入するまでは、パートナーが登録されてない場合は、「パートナーに登録してもらってください」って。メッセージ出しておこうか?
てか、partnersテーブルというものがあるんだけど、、、、、
今更だけど、、、すんごいこれが要らない気がしてきた。
usersテーブルに外部キー制約なしでreference型でpartner_idを持たせればいいだけな気がしてきた。
ちょっとやってみます。
だめでしたw
#migration_file
def change
add_reference :users, :partner, index: true, references: :users
end
#User.rb
has_one :partner, class_name: 'User' #追記
で
# rails console
user = User.first
user.assign_attributes(partner_id: 2)
user.save(validate: false)
partner_idを登録しようとすると
NameError: uninitialized constant User::user
というエラー。
同じテーブルは参照できないのかな?
できたーーー
アソシエーションが間違ってましたw
has_one じゃなくて belongs_toでした。
# User.rb
belongs_to :partner, class_name: 'User'
これで
#rails c -e test
[1] pry(main)> user = User.first
User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1 [["LIMIT", 1]]
=> #<User:0x007fe869a38a50
id: 1,
name: "test-user1",
email: "user1@gmail.com",
password_digest:
"$2a$04$EIFZjWmz2r5yTUWDrTGqN.nOhV0Eczs20v7MDvdUgIjtuXcP983Sm",
created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
updated_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
allow_share_own: false,
partner_id: nil>
[2] pry(main)> user.partner
=> nil
[3] pry(main)> user.assign_attributes(partner_id: 2)
=> nil
[4] pry(main)> user.save(validate: false)
(1.2ms) BEGIN
SQL (1.6ms) UPDATE "users" SET "updated_at" = $1, "partner_id" = $2 WHERE "users"."id" = $3 [["updated_at", "2018-08-19 10:31:14.236434"], ["partner_id", 2], ["id", 1]]
(0.6ms) COMMIT
=> true
[5] pry(main)> pp user
#<User:0x007fe869a38a50
id: 1,
name: "test-user1",
email: "user1@gmail.com",
password_digest:
"$2a$04$EIFZjWmz2r5yTUWDrTGqN.nOhV0Eczs20v7MDvdUgIjtuXcP983Sm",
created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
updated_at: Sun, 19 Aug 2018 10:31:14 JST +09:00,
allow_share_own: false,
partner_id: 2>
[6] pry(main)> user.partner
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
=> #<User:0x007fe8677ed720
id: 2,
name: "test-user2",
email: "user2@gmail.com",
password_digest:
"$2a$04$MtOH.1SkaB6sBuK2gjP2x.nW9mJJB6IlrnfAVXisnChBKgRwTElSm",
created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
updated_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
allow_share_own: false,
partner_id: nil>
下記の処理ができたので、stagingとmasterにブランチにあげてます。
・usersにpartnerカラムの追加
・partnersテーブルのdrop
・partnerのmodel, controller, viewsの消去
・partnerに関連するメソッドをfix
・users_controllerにpartner登録を追加
made enable to work without partner model and controller
chaging everything related with Partner model
drop partners table and deleted everything belonging to partners model and add partner_id to users
でも、partner_idなしで登録できなくなってしまった。
たぶんbelongs_toのせい。
修正できました。rails5からは belogns_to
のアソシエーションつけると、その外部キーなしでは登録できなくなるのでした。でもoptional: true
というオプションとつけると入力できるようになります。
これははまる方多いそうなので、覚えておくといいと思います。
あと、partner_idにモデル側とDB側にユニーク制約をつけました。
ですが、コントローラでその分岐がありません。
パートナーを検索して、すでに登録されているという気まずいパターンですねww
こちらのissueはusers_controllerに変更を加えていくと思うので、その分岐を加えていただけたらと思います。
このときよりはかなり仕様が変わったのでクローズ