Come assegnare il valore in un oggetto RoR?
-
23-09-2019 - |
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
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