@prneet

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

FormオブジェクトでBcryptのhas_secure_passwordを使用したいです。

Q&A

Closed

Formオブジェクトでhas_secure_passwordを使用したいです。

Ruby on Railsで掲示板アプリをつくっています。
投稿にpassword_dijestカラムを用意して、passwordを使用する事で編集削除できる機能を実装しました。
現在タグ付機能の追加をしようと思い、タグモデル、投稿タグリレーションモデルを用意してFormオブジェクトを使用しています、するとパスワードが暗号化されなくなり編集削除時にエラーが起こります。
解決方法を教えて下さい。

発生している問題・エラー

BCrypt::Errors::InvalidHash

または、問題・エラーが起きている画像をここにドラッグアンドドロップ。

該当するソースコード

class RecruitsTag

  include ActiveModel::Model
  attr_accessor :name, :contact_id, :player_name, :style_id, :sex_id, :text, :tag_name, :password

  HALF_NUMBER_REGEX = /\A[0-9]+\z/.freeze
  has_secure_password
  with_options presence: true do
    validates :name
    validates :player_name
    validates :text
    validates :tag_name
    validates :password, format: { with: HALF_NUMBER_REGEX, message: "半角数字"}
  end

  def save
    recruit = Recruit.create(name: name, contact_id: contact_id, player_name: player_name,style_id: style_id,
      sex_id: sex_id, text: text, password_digest: password)
    tag = Tag.where(tag_name: tag_name).first_or_initialize
    tag.save

    RecruitTagRelation.create(recruit_id: recruit.id, tag_id: tag.id)
  end
end
ソースコードを入力
class Recruit < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :contact
  belongs_to_active_hash :style
  belongs_to_active_hash :sex
  has_many :recruit_tag_relations
  has_many :tags, through: :recruit_tag_relations
  has_secure_password
end
0 likes

4Answer

Comments

  1. @prneet

    Questioner

    回答ありがとうございます。

回答ありがとうございます、一度rails db:migrate:resetしてみて試してみましたがエラーの解決にはいたりませんでした。:passwordのパラメーターを全て:password_digestにしてみても保存はできますが、「パスワードを変更してください、データ侵害によりパスワード情報が流出しました」とアラートが出てDBを確認すると暗号化されていないパスワードが保存されてしまいます。

def create
    @recruit = RecruitsTag.new(recruit_params)
    if @recruit.valid? 
      @recruit.save
      return redirect_to root_path
    else
      render :new
    end
  end
def recruit_params
    params.require(:recruits_tag).permit(:name, :contact_id, :player_name, :style_id, :sex_id, :text, :password, :tag_name)
  end
create_table "recruits", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", null: false
    t.integer "contact_id", null: false
    t.string "player_name", null: false
    t.integer "style_id", null: false
    t.integer "sex_id", null: false
    t.string "text", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "password_digest"
  end
0Like

RecruitsTagのsaveメソッド部分、(password_digest: pasword)を(password: password)に変更する事で暗号化に成功しました!

0Like

Your answer might help someone💌