Domanda

Ho un oggetto ordine, che hanno un metodo come questo creare:

 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

Voglio impostare lo status_id @order a "1", in modo da avere il

 @order.status_id = "1" 

Ma questo codice non è lavoro, dopo che ho rimuovere il commento che, ancora non può salvare "1" nella status_id in db, ma altro attributo può con successo negozio.

order.rb

class Order < ActiveRecord::Base
  has_many :order_items
  belongs_to :status

end
È stato utile?

Soluzione

Si dovrebbe essere in grado di assegnare un valore di stringa a una chiave rapporto e sarà convertito come richiesto. I params vengono sempre in come stringhe, quindi ovviamente questo deve accadere per qualsiasi cosa per essere al lavoro.

Questo è il tipo di situazione in cui una prova di unità robusta aiuterebbe a restringere la portata del problema. Può essere uno dei seguenti:

  • C'è un attr_accessor definito per status_id che sta bloccando l'assegnazione.
  • È status_id = metodo definito che blocca l'assegnazione.
  • Lo status_id è essere ripristinato durante una chiamata o before_validation before_save.

Che ci si vuole creare una routine di test che verifica questo funziona:

def test_status_assignment
  order = Order.new

  order.status_id = '1'

  order.save

  assert_equal 1, order.status_id
end

Altri suggerimenti

Si potrebbe avere attr_accessible nel modello si blocca da assegnare a quel campo. Lo fa utilizzando una whitelist di campi autorizzati.

Cambia @order.status_id = "1" a @order.status_id = 1

Rubino può essere la lettura "1" come stringa (che si suppone di fare) invece di un numero intero (quello che si sta probabilmente cercando). Quando si rimuove le virgolette rubino lo interpreterà come un intero. Se si deve lasciare come una stringa, provare qualcosa di simile my_string.to_i o "123".to_i.

Se questo non funziona, si prega di inviare qualsiasi messaggio di errore che si ricevono.

Questo

@order.status_id = "1"

dovrebbe essere

@order.status_id = 1

O forse

@order.status = Status.find_by_id(1)

se hai rapporti ben disposti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top