Le code de test unitaire suivant échoue.
item_spec.rb
it 'Seuls les nombres demi-largeur peuvent être enregistrés' do
@item.price = '1000'
@item.valid?
expect(@item.errors.full_messages).to include('Price Half-width characters.')
end
Lors de l'affectation de la chaîne de caractères "1000" à l'élément de type entier "prix", Une conversion de type implicite a été effectuée et le prix a reçu le numéro "0".
↓ Vérifiez comment la conversion de type implicite est effectuée sur la console ↓
irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> 0
Après avoir remplacé la chaîne de caractères "1000", la valeur du prix sera la valeur numérique "0".
Cela est dû à une fonctionnalité appelée «API Active Record Attributes» ajoutée dans Rails 5. La conversion de type implicite est une image dans laquelle le setter suivant se déplace dans les coulisses. Le point est to_i.
#Setter
def price=(price)
@price = price.to_i
end
Résolu en écrivant ce qui suit dans le modèle Item
item.rb
class Item < ApplicationRecord
attr_accessor :price
[Explication] attr_accessor est une méthode qui peut réaliser le traitement setter / getter pour les éléments. La description suivante et "attr_accessor: price" ont la même signification.
#Setter
def price=(price)
@price = price
end
#Getter
def price
@price
end
Autrement dit, en appelant un pur setter (pas to_i) avec ceci Vous pourrez attribuer une chaîne qui n'est pas to_i à price.
irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> "1000"
Pour le mécanisme de l '"API Active Record Attributes", je me suis référé à l'article suivant. https://www.wantedly.com/companies/wantedly/post_articles/31132
Recommended Posts