🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

解決済

1回答

882閲覧

Rails before_updateを条件付きにするには

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/09/18 06:30

Railsでgemを使用せずパスワードの暗号化と編集ページを作成しています。

ユーザー情報の編集ページで、パスワードが未入力であれば、パスワードは更新せずDBに登録済みのパスワードを使用したいのですが、どうやってもうまくいきません。
パスワードが未入力の場合は、before_updateをスルーできれば良いのですが、どうしても思いつきません。
何かヒントをいただけないでしょうか?

UserModel

1before_update :convert_password 2 3# パスワードを暗号化 4def convert_password 5 self.password = User.generate_password(self.password) 6end 7 8def self.generate_password(password) 9 unless self.password == current_user.password 10 # パスワードに適当な文字列を付加して暗号化する 11 salt = 'jf;adjsfueiaofhq4erhbfui2qwlhf8qwhfeuiwl' 12 Digest::MD5.hexdigest(salt + password) 13 end 14end 15 16 validates :password, presence: true, 17 length:{minimum: 8, message: 'は8文字以上で入力してください'}, 18 confirmation:true, 19 format:{with: /\A[a-zA-Z\d]+\z/, message: 'は英数字のみ使用できます'}

UsersController

1 if params[:user][:password].blank? and params[:user][:password_confirmation].blank? and params[:user][:password].length == 0 2 params[:user][:password] = current_user.password 3 params[:user][:password_confirmation] = current_user.password 4 @user.update(user_params) 5elsif params[:user][:password].length < 8 6 message = '' 7 @user.errors.full_messages.each do |m| 8 message = message + m + "<br>" 9 end 10 flash[:danger] = message 11else 12 # パスワードが入力されていたら 13 @user.update(user_params) 14end

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

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

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

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

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

guest

回答1

0

ベストアンサー

パスワードが未入力の場合は、before_updateをスルーできれば良いのですが

:ifオプションを使ってください。

rb

class Order < ApplicationRecord
before_save :normalize_card_number,
if: Proc.new { |order| order.paid_with_card? }
end

Active Record 条件付きコールバック

投稿2019/09/18 07:26

Mugheart

総合スコア2349

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

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

退会済みユーザー

退会済みユーザー

2019/09/18 08:08

if: Proc.new { |order| order.paid_with_card? }の部分は もし: Proc.new { |orderモデル| orderモデルの.paid_with_cardという値が空なら }という意味でしょうか?ifオプションについて調べているのですが、なかなか理解できずにいます...
Mugheart

2019/09/18 08:51 編集

サンプルコードはURLのページから抜粋したものであって質問に合わせたコードではないです。 ドキュメントのURLを貼ったのですが読みましたか? procとシンボルのいずれかの方法があるので、例えばですけど before_update :convert_password unless: :password_change? def password_change? ... end こんな感じで書けばいいかなと思います。
退会済みユーザー

退会済みユーザー

2019/09/19 01:38

ありがとうございました! URLは読んだのですがprocの概念をまだ理解しきれておらず、お手数をおかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問