题
我有一个订单对象,它有一个像这样的创建方法:
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
我想将@order status_id设置为“1”,所以我有
@order.status_id = "1"
但是这段代码不起作用,取消注释后,它仍然无法将“1”保存到db中的status_id中,但其他属性可以成功存储。
订单.rb
class Order < ActiveRecord::Base
has_many :order_items
belongs_to :status
end
解决方案
您应该能够将字符串值分配给关系键,并且它将根据需要进行转换。参数始终以字符串形式出现,因此显然需要发生这种情况才能正常工作。
在这种情况下,强大的单元测试将有助于缩小问题的范围。它可能是以下之一:
- 为 status_id 定义的 attr_accessor 会阻止分配。
- 定义了一个 status_id= 方法来阻止分配。
- status_id 在 before_validation 或 before_save 调用期间被重置。
您需要创建一个测试例程来验证其是否有效:
def test_status_assignment
order = Order.new
order.status_id = '1'
order.save
assert_equal 1, order.status_id
end
其他提示
您可以有attr_accessible
在你的模型从分配给该字段阻止你。它通过使用批准字段的白名单中做到这一点。
更改@order.status_id = "1"
到@order.status_id = 1
红宝石可能读"1"
作为一个字符串(这是应该做的),而不是一个整数(你可能正在寻找)。当你删除引号红宝石将它解释为一个整数。如果你必须把它作为一个字符串,尝试像my_string.to_i
或"123".to_i
。
如果这不起作用,请发表任何错误信息您收到。
此
@order.status_id = "1"
应
@order.status_id = 1
或者,也许
@order.status = Status.find_by_id(1)
如果你设置了很好的关系。
不隶属于 StackOverflow