Pergunta

Eu tenho um objeto de ordem, que tem um método de criação 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

Eu quero definir o @order status_id como "1", então eu tenho o

 @order.status_id = "1" 

Mas esse código não é trabalho, depois de descompor -o, ele ainda não pode salvar "1" no status_id no banco de dados, mas outro atributo pode armazenar com sucesso.

ordem.rb

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

end
Foi útil?

Solução

Você poderá atribuir um valor de string a uma chave de relacionamento e ela será convertida conforme necessário. Os parâmetros sempre vêm como cordas, então, obviamente, isso precisa ocorrer para que qualquer coisa esteja funcionando.

Esse é o tipo de situação em que um teste de unidade robusto ajudaria a diminuir o escopo do problema. Pode ser um de:

  • Existe um att_accessor definido para status_id que está bloqueando a atribuição.
  • Existe um método status_id = definido que está bloqueando a atribuição.
  • O status_id está sendo redefinido durante uma chamada antes_validação ou antes_save.

Você gostaria de criar uma rotina de teste que verifique isso funciona:

def test_status_assignment
  order = Order.new

  order.status_id = '1'

  order.save

  assert_equal 1, order.status_id
end

Outras dicas

Você pode ter attr_accessible Em seu modelo, bloqueando você de atribuir a esse campo. Faz isso usando uma lista de permissões de campos aprovados.

Mudar @order.status_id = "1" para @order.status_id = 1

Ruby pode estar lendo "1" como uma string (o que deveria fazer) em vez de um número inteiro (o que você provavelmente está procurando). Quando você remove as citações, o Ruby o interpretará como um número inteiro. Se você deve deixá -lo como uma corda, tente algo como my_string.to_i ou "123".to_i.

Se isso não funcionar, poste qualquer mensagem de erro que você esteja recebendo.

este

@order.status_id = "1"

deveria estar

@order.status_id = 1

Ou talvez

@order.status = Status.find_by_id(1)

Se você tem relacionamentos configurados bem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top