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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

1053閲覧

Twitterのユーザー名と同じバリデーションをつけたい

bok_sakai

総合スコア20

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/10/14 00:25

編集2019/10/14 01:43

実現したいこと

rails6を実際に動かしながら勉強している者です。

test_appに、Deviseで生成したuserテーブルに、usernameを追加しました。
このusernameに、Twitterのユーザー名と同じバリデーションを設定したいのですが、調べてみてもなかなかそのやり方が分からず困っています。

具体的には、

・半角英数字とアンダーバー
・被り禁止(aaaaとAAaaは被り判定)
・Twitterという文字列を含ませることはできない

Twitterでは、ユーザー名を設定する時に@AAaaというユーザーが既にいる場合、@aaaaというユーザー名は設定できませんが、プロフィールなどで表示される時にはきちんと@AAaaと表示されます。これは大文字小文字を一緒くたにしていない、つまり区別があるということだと思っていたのですが、間違いでしょうか。
また、正規表現などで上の条件を作るとき、どのような表現になるのか教えていただけたら嬉しいです。

初心者なものでくだらない質問をしてしまって申し訳ありませんが、何卒よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/14 00:29

railsチュートリアルを通していたらそんな質問は出てこないと思います。 いきなりdeviseを使うような横着はせずまずはrailsチュートリアルを勉強して下さい。
退会済みユーザー

退会済みユーザー

2019/10/14 01:15

条件にある下記が矛盾している気がします。 ・大文字小文字の区別はあり ・被り禁止(aaaaとAAaaは被り判定) 大文字小文字の区別しているのならaaaaとAAaaは被りではないのでは?
bok_sakai

2019/10/14 01:36

すみません、モチベーションを保つために本やサイトを参考にしながら勝手に学習を進めていました。 初心者がDeviseを使うのはあまり良くないのですね、勉強になります、すみませんでしたm(_ _)m 言葉の使い方を間違えていたようなので質問の方を修正させていただきました。 チュートリアルの方もこれから学んでいこうと思います。
guest

回答1

0

ベストアンサー

正規表現に自信がないのであっているかはわかりませんが、こんな感じになるかと思います。

validates :username, uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\_]+\z/ }, exclusion: { in: %w(Twitter) }

投稿2019/10/14 02:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bok_sakai

2019/10/15 06:47

ご回答ありがとうございます。 早速使わせていただき、大体はうまくいったのですが、 「Twitterという文字列は使えない」という条件がうまくいきませんでした。 Twitterという文字列だけで打つときちんと弾かれるのですが、 前後に違う字が入るとOKになってしまいます。。。どのように修正すればいいでしょうか。
退会済みユーザー

退会済みユーザー

2019/10/15 08:50 編集

すみません。条件を見間違えていました。 「Twitter」だけだめで前後の文字が入っていればOKかと思っていました。 少し煩雑になりますが、下記のようにすれば行けるかと思います。 validates :username, uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\_]+\z/ }, if: :include_twitter? def include_twitter? errors.add(:username, "は禁止文字が入っています") if self.username.match(/Twitter/i) != nil end もう少しいい書き方があるとは思いますが、ちょっと自分ではわからないです。。。
bok_sakai

2019/10/17 03:10

返信遅れてしまいすみません! 教えていただいたコードでとりあえず実現できました! より良い書き方は自分で勉強しながら見つけてみます、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問