Cómo asignar un valor en un objeto de RoR?
-
23-09-2019 - |
Pregunta
Tengo un objeto de orden, que tienen un crear método como este:
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
Quiero configurar el status_id @order a "1", por lo que tengo el
@order.status_id = "1"
Sin embargo, este código no es un trabajo, después de que descomentarla, todavía no se puede guardar "1" en la status_id en dB, pero otro atributo éxito puede almacenar.
order.rb
class Order < ActiveRecord::Base
has_many :order_items
belongs_to :status
end
Solución
debe ser capaz de asignar un valor de cadena a una tecla de relación y que se convertirá según sea necesario. Los parametros siempre vienen en forma de cadenas, así que obviamente esto tiene que ocurrir para cualquier cosa que se va trabajando.
Este es el tipo de situación en la que una prueba de unidad robusta podría ayudar a reducir el alcance del problema. Puede ser uno de:
- Hay una attr_accessor definido para status_id que está bloqueando la asignación.
- Hay una status_id = método definido que está bloqueando la asignación.
- El status_id se restablece durante una before_validation o before_save llamada.
Lo que quiere crear una rutina de prueba que verifica esto funciona:
def test_status_assignment
order = Order.new
order.status_id = '1'
order.save
assert_equal 1, order.status_id
end
Otros consejos
podría tener attr_accessible
en su modelo que el bloqueo de la asignación a ese campo. Esto se logra mediante el uso de una lista blanca de campos aprobados.
Cambiar @order.status_id = "1"
a @order.status_id = 1
Rubí puede estar leyendo "1"
como una cadena (que se supone que debe hacerlo) en lugar de un número entero (lo que es probable que esté buscando). Al quitar las comillas rubí lo interpretará como un entero. Si tiene que salir como una cadena, intentar algo así como my_string.to_i
o "123".to_i
.
Si esto no funciona, por favor, puesto cualquier mensaje de error que está recibiendo.
Este
@order.status_id = "1"
debería ser
@order.status_id = 1
O tal
@order.status = Status.find_by_id(1)
si tiene relaciones preparó muy bien