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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top