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

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

ただいまの
回答率

87.77%

Bcryptを使用して新規登録機能を実装したのですがパスワードが一致しなくてもエラーにならず通ってしまう。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 693

score 5

Bcryptを使って新規登録機能を実装させたのですがform_forのpasswordとpassword_confirmationが違う場合でもアカウントが作成されてしまいます。
passwordカラムにかけたvalidatesはしっかり機能しておりhas_secure_passwordもuser.rbに書いており一致しなかった場合エラーを吐くはずなのですが何故なのでしょうか?
Bcryptに関してのエラーのドキュメントがなく自分では解決できなかったのでお力添えいただけると幸いです。
os: mac
Ruby 2.6.5
RoR 5.2.2
Mysql 5.7
Docker

user.rb

class User < ApplicationRecord
    validates :name ,presence: true, unless: :uid?
    validates :comment, length: { maximum: 100}

    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email ,presence: true, unless: :uid?, format: {with: 
               VALID_EMAIL_REGEX},uniqueness: true

    has_secure_password
    validates :password, presence: true,length: { minimum: 6 }

    mount_uploader :image, ImageUploader
end


users/new.htnl.erb

<% provide(:title,"新規登録")%>
<div class="image">
  <div class="wrap">
    <div id = "sign_up"><h2>新規登録</h2></div>
    <div class="signup_form">
      <%= form_for(@user) do |f| %>
        <%= render 'layouts/error_messages' , model: f.object %>

          <%= f.label :name, 'ユーザーネーム' %>
          <%= f.text_field :name, class: 'login-and-signup' %>

          <%= f.label :email, 'メールアドレス' %>
          <%= f.email_field :email, class: 'login-and-signup' %>

          <%= f.label :password, 'パスワード(6文字以上)'%>
          <%= f.password_field :password, class: 'login-and-signup' %>

          <%= f.label :password_confirmation, 'パスワード(もう一度ご入力ください)' %>
          <%= f.password_field :password_confirmation, class: 'login-and-signup' %>

          <%= f.submit '登録' , class:'btn login-and-signup-submit' %>
      <% end %>
      <h4 class="TwitterAPI">------------または------------</h4>
      <%= link_to "Twitter認証ログイン" ,"/auth/twitter", method: :post %>
    </div>
  </div>
</div>


users_controller

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
      flash[:success] = "アカウントを作成しました"
      redirect_to @user
    else
      render 'new'
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
   @user =User.find(params[:id])
   if @user.update_attributes(edit_params)
     flash[:success] ="編集しました"
     redirect_to @user
   else
     render 'edit'
   end
 end


  private
  def user_params
    params.require(:user).permit(:name,:email,:password,:pasword_confirmation)
  end

  def edit_params
    params.require(:user).permit(:name,:email,:comment,:image)
  end


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

params.require(:user).permit(:name,:email,:password,:pasword_confirmation)

ここでpasword_confirmationとスペルミスになっているためpassword_confirmationの値が伝わらず、しかもpassword_confirmation == nilの場合はチェックをバイパスするため(Rails API)、問題なく通ってしまったようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/11 22:03

    そのようでした。
    修正したところ無事に機能しました、ありがとうございます!

    キャンセル

checkベストアンサー

+1

コードを見る限り問題なさそうに見えますが、不思議ですね・・・

has_secure_passwordもuser.rbに書いており一致しなかった場合エラーを吐くはずなのですが

これは、

(1) 登録ボタン押下時、"パスワードが一致しません。" のようなメッセージが表示されるが、データが登録されてしまう
(2) 登録ボタン押下時、エラーが出ずにデータが登録されてしまう

のどちらでしょうか?

--

※追記※

コントローラーのコードの掲載、ありがとうございます!

user_params メソッドにタイプミスがあるようです。

誤: pasword_confirmation
正: password_confirmation

おそらく、タイプミスのため画面の password_confirmation がモデルに渡されず、うまく検証できなかったのではと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/10 11:29

    更新いたしました。確認のほどお願いいたします。

    キャンセル

  • 2020/01/10 11:36

    user_params メソッドにタイプミスがあるようです。

    誤: pasword_confirmation
    正: password_confirmation

    おそらく、タイプミスのため画面の password_confirmation がモデルに渡されず、うまく検証できなかったのではと思います。

    キャンセル

  • 2020/01/10 12:10

    本当でした;;

    一番最初に書いたものでそれについてのテストをしていなかったので完全に見落としてました。

    迅速な対応ありがとうございました、以後typoには気をつけたいと思いますmm

    キャンセル

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • Bcryptを使用して新規登録機能を実装したのですがパスワードが一致しなくてもエラーにならず通ってしまう。