如何在RoR对象中赋值?

时间:2010-01-27 13:01:13

标签: ruby-on-rails ruby

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

 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" 

但是这段代码不起作用,在我取消注释之后,它仍然无法在db中的status_id中保存“1”,但其他属性可以成功存储。

order.rb

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

end

4 个答案:

答案 0 :(得分:3)

您应该能够为关系键分配字符串值,并根据需要进行转换。 params总是以字符串形式出现,所以很明显这需要在任何工作中发生。

这种情况下,强大的单元测试有助于缩小问题的范围。它可能是以下之一:

  • 为status_id定义了一个阻止分配的attr_accessor。
  • 定义了一个status_id =方法阻止了分配。
  • 在before_validation或before_save调用期间正在重置status_id。

您需要创建一个验证此工作的测试例程:

def test_status_assignment
  order = Order.new

  order.status_id = '1'

  order.save

  assert_equal 1, order.status_id
end

答案 1 :(得分:1)

您的模型中可能会attr_accessible阻止您分配到该字段。它通过使用已批准字段的白名单来实现此目的。

答案 2 :(得分:1)

@order.status_id = "1"更改为@order.status_id = 1

Ruby可能正在读取"1"作为字符串(它应该这样做)而不是整数(你可能正在寻找的东西)。删除引号时,ruby会将其解释为整数。如果您必须将其保留为字符串,请尝试使用my_string.to_i"123".to_i

如果这不起作用,请发布您收到的任何错误消息。

答案 3 :(得分:1)

@order.status_id = "1"

应该是

@order.status_id = 1

或者

@order.status = Status.find_by_id(1)

如果你能很好地建立关系