質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

225閲覧

【Rails5】Action毎にallow_blank/presenceのバリデーション可否を変えたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/09/11 02:21

Create/Updateアクションでallow_blankやpresenceの可否を分けたい。

要件
User#Createuseridカラムの「空欄を許す
User#{useridのみ決めるAction}useridカラムの「空欄許さない

user.rb(model)

VALID_USERID_REGEX = /\A[a-z0-9]+\z/ validates :userid ,length:{ in: 4..20 } ,format:{with:VALID_USERID_REGEX} ,uniqueness: { case_sensitive: false }

したいことは、サービスの新規登録の流れ。

Twitter等でもおそらく

流れ内容
(1)新規登録
(2)メール認証 → 認証後
(3)一意のユーザIDを決める(※何かしらのアクションで)
(4)twitter.com/{決めたID}が利用可能に

上記の流れがあると思うのですが、それと同じことをしたいと考えてます。

user.rbのuserid
presence:trueとバリデーション表記すると、(1)でバリデーションが引っかかる気がします。

allow_blank:true にすると、userid決定時に、(3)空欄でもフォームを通る気がします。

どのような実装方法が良いでしょうか。ご教授いただける方、致したらよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

(1)の時点でuseridを入力しないなら、ifでメール認証が済んでいるときだけバリデーションを有効にするという方法が使えます。

validates :userid ,(条件省略), if: Proc.new { メール認証済み? }

(1)の時点でuseridは入力してもよいししなくてもよいが、した場合は検査が必要、だと、標準のバリデータだと対応できないと思うので、カスタムバリデータを実装してください。

カスタムバリデータの書き方についてはRailsガイドを参考にしてください。

投稿2017/09/11 04:31

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

上記の流れがあると思うのですが

実装の手間を考えれば、(1)の時点で「一意のユーザーIDを決める」ところを実行する、というのが適当ではないかと思います。

最初の登録時点で決められれば、ユーザーID値もNOT NULLにできますので、「値がない」などの問題を避けられて便利です(データベースのID自動付番で良ければ、それをそのまま使ってもいいですし)。

投稿2017/09/11 02:27

編集2017/09/11 02:46
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/11 03:28

ユーザが結局メール認証をせず、アカウントを放置するケースがあります。 しかし放置されたアカウントにも一意のIDが設定されていると、 使われてないIDが勿体無いというか、そういう場合があるなあと 思ってるのですが、なかなか実装は、面倒でしょうか。
maisumakun

2017/09/11 04:16

IDとして取れる値は32ビット符号付きでも21億個、64ビット符号付きでは900京個(全人類に10億個ずつ振ってもまだ余る)もあります。 「限定生産でシリアルナンバー付きの製品を作る」というような、番号自体に一定の価値がある場面であれば話は別ですが、そうでなければIDの消費を1つケチったことによる、実装の手間を上回るだけのメリットはないと思います(どうせ退会者が出れば飛ぶわけですし)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問