1

私はレールを初めて使用し、レールを使用した実用的なアジャイル Web 開発のデポ アプリケーションに従っていますが、奇妙な問題が発生しています。

私の製品モデルでは、画像の URL フィールドで要求された画像が実際にアセットとして存在することを確認するためのバリデーターを作成しました。これが私の製品モデルコードです。

class Product < ActiveRecord::Base
  attr_accessible :description, :image_url, :price, :title
  validates :description, :price, :title, :presence => true
 validate :image_url_exists, on: :create
  def image_url_exists
    if Rails.application.assets.find_asset(image_url) == nil
      errors.add(:image_url, 'is not valid. The image does not exist.')
    end
  end
end

問題は、単体テストを実行するときです。それが何であるかは次のとおりです。

require 'test_helper'
    class ProductTest < ActiveSupport::TestCase
       test "the products attributes should not be empty" do
         p = Product.new
         assert p.invalid?
       end
    end

しかし、そうすると、私のコードで一連のエラーが発生します。カスタムバリデータがなければ、すべてうまくいくように見えます。ここに私が現在得ているエラーがあります。

test_the_products_attributes_should_not_be_empty(ProductTest):
TypeError: can't convert nil into String
    /var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:156:in `initialize'
    /var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:156:in `new'
    /var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:156:in `find_asset'
    /var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:60:in `find_asset'
    /var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/environment.rb:78:in `find_asset'
    /home/saurabh/Desktop/SCRIPTS/Rails/depot/app/models/product.rb:6:in `image_url_exists'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:418:in `_run__4343689776242734370__validate__107120755283260520__callbacks'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:405:in `__run_callback'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:385:in `_run_validate_callbacks'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:81:in `run_callbacks'
    /var/lib/gems/1.9.1/gems/activemodel-3.2.9/lib/active_model/validations.rb:228:in `run_validations!'
    /var/lib/gems/1.9.1/gems/activemodel-3.2.9/lib/active_model/validations/callbacks.rb:53:in `block in run_validations!'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:403:in `_run__4343689776242734370__validation__107120755283260520__callbacks'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:405:in `__run_callback'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:385:in `_run_validation_callbacks'
    /var/lib/gems/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:81:in `run_callbacks'
    /var/lib/gems/1.9.1/gems/activemodel-3.2.9/lib/active_model/validations/callbacks.rb:53:in `run_validations!'
    /var/lib/gems/1.9.1/gems/activemodel-3.2.9/lib/active_model/validations.rb:195:in `valid?'
    /var/lib/gems/1.9.1/gems/activerecord-3.2.9/lib/active_record/validations.rb:69:in `valid?'
    /var/lib/gems/1.9.1/gems/activemodel-3.2.9/lib/active_model/validations.rb:203:in `invalid?'
4

1 に答える 1

5

問題は、Rails.application.assets.find_asset(image_url)テスト時に更新オブジェクトを作成するときです。image_urlnil

p = Product.new # Here p.image_url => nil

ログを見るとエラーの理由を見つけることができます

/var/lib/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:156:in `initialize'

ここ (リンク) エラーが発生する 156 行目は、pathここにnilありました。

したがって、この問題を解決するには、nil でないifかどうかを確認する条件を追加する必要があります。これが私の提案ですimage_url

if self.image_url.nil? || Rails.application.assets.find_asset(self.image_url).nil?
  errors.add(:image_url, 'is not valid. The image does not exist.')
end
于 2013-01-10T00:08:45.190 に答える