Comment attribuer une valeur dans un objet RoR ?
-
23-09-2019 - |
Question
J'ai un objet order, qui a une méthode create comme celle-ci :
def create
@order = Order.new(params[:order])
# @order.status_id = "1"
respond_to do |format|
if @order.save
flash[:notice] = 'Order was successfully created.'
format.html { redirect_to(@order) }
format.xml { render :xml => @order, :status => :created, :location => @order }
else
format.html { render :action => "new" }
format.xml { render :xml => @order.errors, :status => :unprocessable_entity }
end
end
end
Je veux définir le @order status_id sur "1", j'ai donc le
@order.status_id = "1"
Mais ce code ne fonctionne pas, après l'avoir décommenté, il ne peut toujours pas enregistrer "1" dans le status_id de la base de données, mais un autre attribut peut être stocké avec succès.
commande.rb
class Order < ActiveRecord::Base
has_many :order_items
belongs_to :status
end
La solution
Vous devriez être en mesure d'attribuer une valeur de chaîne à une clé de relation et il sera converti au besoin. Les params sont toujours sous forme de chaînes, donc évidemment cela doit se produire pour quoi que ce soit pour travailler.
Ceci est le genre de situation où un test unitaire robuste contribuerait à réduire la portée du problème. Il peut être:
- Il y a un attr_accessor défini pour status_id qui bloque l'affectation.
- Il y a un status_id = méthode définie qui bloque l'affectation.
- Le status_id est en cours de réinitialisation lors d'un appel before_validation ou before_save.
Vous voudriez créer une routine de test qui vérifie cela fonctionne:
def test_status_assignment
order = Order.new
order.status_id = '1'
order.save
assert_equal 1, order.status_id
end
Autres conseils
Vous pourriez avoir attr_accessible
dans votre modèle vous empêche d'attribuer à ce champ. Il le fait en utilisant une liste blanche des domaines approuvés.
Changement @order.status_id = "1"
à @order.status_id = 1
Ruby est peut-être en train de lire "1"
sous forme de chaîne (ce qu'il est censé faire) au lieu d'un entier (ce que vous recherchez probablement).Lorsque vous supprimez les guillemets, Ruby les interprétera comme un nombre entier.Si vous devez le laisser sous forme de chaîne, essayez quelque chose comme my_string.to_i
ou "123".to_i
.
Si cela ne fonctionne pas, veuillez publier le message d'erreur que vous recevez.
@order.status_id = "1"
doit être
@order.status_id = 1
Ou peut-être
@order.status = Status.find_by_id(1)
si vous avez des relations bien établies