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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top