Ruby on Rails 「attr_accessor」 の使い方について
こんにちは。
現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。
attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。
問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状態になってしまうことです。
「:if => 項目?」を書いてみると、「undefined method」のエラーがでてしまいます。
どなたか対応策の分かる方がおられましたらご教授いただけないでしょうか?
下記に実際の問題箇所のモデルクラスのソースを書いておきます。
class User < ActiveRecord::Base
attr_accessor :NEW_USER_PW ← 追加したアクセサ
# 追加したアクセサに対するチェック
validates_length_of :NEW_USER_PW, :minimum=>4, :message=>"は%d桁以上を設定してくださ
い。", :on => :update, :if => :NEW_USER_PW?
end
上記のチェック内の「:if => :NEW_USER_PW?」で落ちてしまいます。
入力がないのにチェックに引っかかるとまずいので、入力がないときだけ上記チェックを行えれば良いのですが・・・。
どうぞ宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
attr_accessor :NEW_USER_PWを定義したからといって、
NEW_USER_PW?メソッドが定義されるわけではりません。
attr_accessorはゲッターとセッターメソッドを作るだけです。
それ以外の論理値を返すようなメソッドは自作しなければなりません。
NEW_USER_PW?メソッドを作成されていないのなら、「undefined method」が
出てしまうのは当然です。
質問にあるように、「入力があった場合のみ」とありますので、
NEW_USER_PW?メソッドを下記のように実装すればチェック可能です。
def NEW_USER_PW?
@NEW_USER_PW.size > 0
end
また、ifにはprocオブジェクトを渡すこともできますので、
:if => Proc.new{|u| u.NEW_USER_PW.size > 0}
と書いてもいいでしょう。
NEW_USER_PWというインスタンス変数はすべて大文字を使用されていますが、
見る人によっては定数と勘違いします。
変数であれば小文字表記を利用するほうが良いかもしれません。
ご回答ありがとうございます。
宣言さえすれば、DB項目と同じように使えるとばかり思っていました。
attr_accessorの事をそもそも理解できておらず、大変勉強になりました。
ご回答いただいた2通りのやり方のどちらでも、値が入った時のみチェックを行うということが出来ました。
また、大文字変数のご指摘、確かに紛らわしいのでよくないですね。。
まだまだ勉強が全く足りないのでもっと頑張りたいと思います。
この度はありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- JavaScript ソースコードは下の共有コードサイト「張り紙」にあります。 入力フォームの javascript で 1 2022/05/11 11:01
- JavaScript 助けてください!スパムメールがとんでもなく大量に届きます。 3 2023/08/10 16:32
- Visual Basic(VBA) Excel・ユーザーフォームの情報を受け渡したい 4 2022/06/08 10:11
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- その他(社会・学校・職場) 業務内容についてどう思いますか? 私は客先の仕事を下請けとして行うという仕事をしていますが、(客先の 2 2022/05/04 16:17
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Ruby:シルバーについて
-
実行時エラー450:引数の数が一...
-
正規表現で両端に文字列を置換
-
get() と find() の違いについて
-
Csvファイルの最終行を取得する...
-
エラー「メソッドまたはデータ...
-
VBAで型が一致しないエラー(バ...
-
pythonのerrorコード
-
パイソンのクラス
-
No route matches [GET] "/post...
-
Rubyについて質問です
-
ぱいソン
-
VBA/GetTickCountの49.7日の境...
-
Rubyでクラスファイルをディレ...
-
テンプレートの特殊化でコンパ...
-
10円未満を切り捨てる方法は?
-
Ruby 特異メソッドのnewが先に...
-
Ruby
-
ruby:モジュール関数について
-
クラス名やモジュール名の競合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
get() と find() の違いについて
-
エラー「メソッドまたはデータ...
-
教えてください。vb5.0
-
VBAで型が一致しないエラー(バ...
-
実行時エラー450:引数の数が一...
-
エクセルVBA オートフィルタで...
-
メソッド定義の構文のdefって
-
Csvファイルの最終行を取得する...
-
A1の値をファイル名に指定した...
-
Pythonで複数のメソッドをまと...
-
RubyでバイナリデータをIOスト...
-
Rubyでnet::httpを用いてPOSTする
-
VBからAccessのデータベースを...
-
define_singleton_methodについて
-
RubyのDateクラスのメソッドが...
-
Ruby:シルバーについて
-
pythonで、構文エラー
-
Pythonでcall_user_funcを行う
-
【Ruby on Rails】モデルのメソ...
-
.sub(/.+/,"aaaaaaa#{$&}"の置...
おすすめ情報