Como atribuir valor em um objeto ROR?
-
23-09-2019 - |
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
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