Der folgende Unit-Test-Code schlägt fehl.
item_spec.rb
it 'Es können nur Zahlen mit halber Breite gespeichert werden' do
@item.price = '1000'
@item.valid?
expect(@item.errors.full_messages).to include('Price Half-width characters.')
end
Wenn Sie dem ganzzahligen Element "Preis" die Zeichenfolge "1000" zuweisen, Die implizite Typkonvertierung wurde durchgeführt und dem Preis wurde die Nummer "0" zugewiesen.
↓ Überprüfen Sie, wie die implizite Typkonvertierung auf der Konsole durchgeführt wird. ↓
irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> 0
Nach dem Ersetzen der Zeichenfolge "1000" ist der Preiswert der numerische Wert "0".
Dies ist auf eine Funktion namens "Active Record Attributes API" zurückzuführen, die in Rails 5 hinzugefügt wurde. Die implizite Typkonvertierung ist ein Bild, in dem sich der folgende Setter hinter die Kulissen bewegt. Der Punkt ist to_i.
#Setter
def price=(price)
@price = price.to_i
end
Gelöst durch Schreiben des Folgenden in das Artikelmodell
item.rb
class Item < ApplicationRecord
attr_accessor :price
[Erläuterung] attr_accessor ist eine Methode, die die Setter / Getter-Verarbeitung für Elemente implementieren kann. Die folgende Beschreibung und "attr_accessor: price" haben dieselbe Bedeutung.
#Setter
def price=(price)
@price = price
end
#Getter
def price
@price
end
Das heißt, indem Sie damit einen reinen Setter (nicht to_i) aufrufen Sie können dem Preis eine Zeichenfolge zuweisen, die nicht to_i ist.
irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> "1000"
Für den Mechanismus der "Active Record Attributes API" habe ich auf den folgenden Artikel verwiesen. https://www.wantedly.com/companies/wantedly/post_articles/31132