0

モデルがあり、いくつかの検証を追加しています

これは私がもともと持っていたものです:

  validates :speed,
    allow_blank: true,
    numericality: { only_integer: true, greater_than: 0 }

しかし、CSV ファイルから項目をインポートするときにエラーが発生し続けます。

速度は整数でなければなりません

次に、次のように変更しました。

  validates :speed,
    numericality: { only_integer: true, greater_than: 0 }, unless: "speed.nil?"

しかし、ここでも同じエラーが発生します。

基本的に、速度が渡されない限り、速度が数値であり、1より大きいことを検証し、その空白の値を許可する必要があります。

何か案は?

CSV インポーター:

def self.import_from_csv(file)
    Coaster.destroy_all

    csv_file = CSV.parse(
      File.read(
        file.tempfile,
        {encoding: 'UTF-8'}
      ),
      headers: true,
      header_converters: :symbol
    )

    csv_file.each do |row|

      coaster_name = row[:name]

      # No need to keep track of coasters already in the database as the CSV only lists each coaster once unlike parks

      # create the new coaster
      park = Park.find_by_name_and_location_1(row[:park], row[:location_1])
      manufacturer = Manufacturer.find_by_name(row[:manufacturer])

      coaster = Coaster.create!({
        name:             row[:name],
        height:           row[:height],
        speed:            row[:speed],
        length:           row[:length],
        inversions:       row[:inversions] == nil ? 0 : row[:inversions],
        material:         (row[:material].downcase if row[:material]),
        lat:              row[:coaster_lat],
        lng:              row[:coaster_lng],
        park_id:          park.id,
        notes:            row[:notes],
        powered:          row[:powered],
        manufacturer_id:  (manufacturer.id if manufacturer),
        covering:         row[:covering],
        ride_style:       row[:ride_style],
        model:            row[:model],
        layout:           row[:layout],
        dates_ridden:     row[:dates_ridden],
        times_ridden:     row[:times_ridden],
        order:            row[:order],
        on_ride_photo:    row[:on_ride_photo] == 1 ? true : false,
        powered:          row[:powered] == 1 ? true : false
      })

      ap "Created #{row[:name]} at #{row[:park]}"

    end
  end
4

3 に答える 3

1

csv の速度の値は文字列として解釈されると思います。速度のために使用している特定の値で .to_i を使用できます。コードを次のように変更します。

  park = Park.find_by_name_and_location_1(row[:park], row[:location_1])
  manufacturer = Manufacturer.find_by_name(row[:manufacturer])
  row_speed = row[:speed].blank? ? nil : row[:speed].to_i

  coaster = Coaster.create!({
    ..... 
    speed:            row_speed,
    .....
  })

そして検証で:

validates :speed, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
于 2013-08-22T18:46:29.390 に答える
0

:allow_nilRailsガイドに記載されているように、検証は引数を受け入れます: http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil

true のときに属性が nil の場合:allow_nil、その特定の検証は、問題の属性が存在する場合にのみ実行されます。

于 2013-08-22T18:58:08.570 に答える
0

私は、数値がallow_nil属性を受け入れることを検証すると思います。これを試して:

validates :speed, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
于 2013-08-22T18:58:31.263 に答える