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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

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

Q&A

解決済

1回答

1292閲覧

仮想的な属性をセットしても、Undefined method が出てしまう

shumbow

総合スコア35

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/07/02 01:47

編集2019/07/02 03:11

入力フォームで、チェックボックスがチェックされている時のみバリーデーションをしたくて、attr_accessorで仮想的な属性を設けて対処しようと思っているのですが、エラーが出てしまいます。

rb

1#モデル 2attr_accessor :last_name, :first_name, :option_check 3 4validates :name, presence: true, length: ... 5validates :email 6. 7. 8 9 10if option_check == '1' ⇦(ここで undefined local variable or method `option_check' for モデル (call 'モデル.connection' to establish a connection):Class が出てしまう) 11 validates :option_1, presence: true, length: { maximum: 30 } 12 validates :option_2, presence: true, length: { maximum: 50 } 13 . 14 . 15 . 16end 17before_validation :set_name 18 19def set_name 20 self.name = [last_name, first_name].join(' ') ⇦問題なく動作する 21end 22 23 24

上記のようにフォームでは他に、名姓を分けてのちに結合して一つの名前にするためにもatttr_accessorを使っていますが、こちらはlast_nameやfirst_nameで値を取得できていて、option_checkはうまくいかないという状況です。
以下、フォーム入力後の遷移先コントローラーでdebuggerでいろいろチェックしてみた結果です。ここでは値が返ってきます。

10: 11: 13: render 'new' if @model.invalid? 14: debugger => 15: end 16: (byebug) @model.option_check "0" (byebug) @model.last_name "山田"

どなたか原因がわかる方ご教授お願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

attr_accessor で定義されるのは instance の、です

if option_check == '1
validates :option_1, presence: true, length: { maximum: 30 }

は、ソースを読み込むときに実行されますので、その時点で定義されていないとだめで、よってこのエラーとなります。

validate :validate_by_option_check

def validate_by_option_check
end

とでもして、そのなかで option_checkで場合分ける、

validates :option_2, presence: true, length: { maximum: 50 },if: { option_check == "1" }
と、条件付きvalidationにするか
でどうでしょう

投稿2019/07/02 03:19

winterboum

総合スコア23284

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

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

shumbow

2019/07/02 06:13

ありがとうございます!なるほど、確かに読み込み時にエラーが出ていました!試してみたのですが、一つ目の方法では validate :validate_by_option_check def validate_by_option_check if option_check == "1" validates :option_1 ⇦ここでundefined method 'validates' for model validates :option_2 end と出てしまいます。validates はモデルクラス直下でないと使えないということでしょうか? また二つめの方法は syntax error, unexpected '}', expecting => ...50 }, if: { option_check == "1" } ... ^がでてしまいました。 validates :option_2, presence: true, length: { maximum: 50 },if: { option_check == "1" }
winterboum

2019/07/02 10:30

>validates はモデルクラス直下でないと使えないということでしょうか? です。 class method で、右に定義したvlaidationを登録する、という役割です。 すみません、2つめは書き方手抜きしました if: Proc.new { |a| a.option_check == "1" } この辺りぐらいは調べて頂けませんか
shumbow

2019/07/03 08:43

2時間ほど調べたのですが、できませんでした。
winterboum

2019/07/03 08:46

validates :option_2, presence: true, length: { maximum: 50 },if: Proc.new { |a| a.option_check == "1"} でも駄目ですか? ん? ”1” の2つめのコーテーションが*になってるように見える。勝手に変わる? 1は”で囲って下さい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問