0

Rails 4e を使用した Agile Web development という本で Rails を学んでいます。これまでのところ、製品モデルとして次のものを使用しています (足場から適応):

class Product < ActiveRecord::Base
  attr_accessible :description, :image_url, :price, :title

  validates :description, :title, :image_url, presence: true
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png)$}i,
    message: 'Must be a valid URL for a gif, png, or jpg..'
  }
end

最初に :image_url の存在をテストするのはなぜだろうと思っていますが、その後、画像の URL が有効であることを確認するための 3 次検証で、最初の検証と矛盾する空白の応答が許可されます。なぜこれがそのまま機能することになっているのかわかりません。

追加の質問として、image_url が空の場合、コードで空かどうかをテストするにはどうすればよいですか? (たとえば、製品ビューでデフォルトの画像を表示します。)

4

3 に答える 3

2

モデルの検証は、単独でテストされます。モデルは、各 validates ステートメントの検証に個別に合格した場合にのみ有効です。

それはおそらく悪い形式であり、4 回目の検証にあると明らかに混乱しallow_blank: trueますが、それはその 1 つのステートメントにのみ適用されます。モデルが有効と見なされるには、すべての検証に合格する必要があるため、1 番目のステートメントは 4 番目よりも厳しい制限を課すだけです。

最後のポイントとして、presenceは非 nilness をテストするのに対し、blankは nil または空の文字列として定義されていることに注意してください。したがって、現在と空白の両方になることが可能です。例えばimage_url = ''。ただし、検証が個別に個別にテストされることは変わりません。

于 2013-06-05T03:39:02.383 に答える
0

検証コードについて混乱していると思いますか?私は初心者ですが、これはおそらく完全に正確ではありません. validates キーワードは存在をテストしません.検証を指定するために使用するブロックを開始します.

現状では、コードは仕様に従って :image_url を検証します (存在する場合) 。allow_blank: true を削除した場合、存在しないか空白の :image_url は検証に失敗します。

于 2013-06-05T01:36:53.410 に答える
0

Railsも初めてで、同じ本を使用しています。私の理解では、検証に対してすぐに 2 つのエラー (フィールドが空白の場合と正しいファイル拡張子がない場合) を返す検証を停止するには、ファイル形式に対して allow_blank を許可する必要があります。

allow_blank: true私が説明できる最善の方法は、コードを削除して説明フォームを再度送信する ことを提案することです.

フィールドが空白であるという検証エラーと、ファイル形式が間違っているという検証エラーの両方が表示されるはずです。

したがって、allow_blank は、フィールドが空白でなくなったら、ファイル形式のエラーのみを検証に指示します。

私も混乱したので、ここにたどり着きました!

于 2013-09-18T19:41:32.977 に答える