我有一个订单对象,它有一个像这样的创建方法:

 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)

如果你设置了很好的关系。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top