ruby-on-rails
  • ruby
  • 2010-01-27 74 views 0 likes 
    0

    我有一个订单对象,其中有一个创建方法是这样的:如何在RoR对象中分配值?

    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 
    
    +0

    你是什么意思由不工作?新订单是否保存在数据库中,但其状态未设置为1?你可以发布你的模型的代码? – mikej 2010-01-27 13:18:40

    +0

    我们可能也需要看模型。 status_id是外键吗?将它设置为整数(1)而不是字符串(“1”)会发生什么? – 2010-01-27 14:03:12

    回答

    3

    你应该能够分配一个字符串值到一个关系密钥,它将根据需要进行转换。这些参数总是以字符串的形式出现,所以显然这需要发生任何事情的工作。

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

    • 有一个attr_accessor为status_id定义,它阻止了赋值。
    • 有一个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 
    
    +0

    很好的解释为什么分配字符串值必须工作并且建议使用单元测试。在执行断言之前,我会更新测试以重新从数据库中检索记录,以便确保正在使用持续值进行比较。 – mikej 2010-01-27 16:07:23

    1

    你可以有attr_accessible在模型中阻止你从分配给该字段。它通过使用批准字段的白名单来实现这一点。

    +1

    我不认为它可以作为attr_accessible和attr_protected仅影响通过批量赋值设置属性,如new(attributes),update_attributes(attributes)或attributes =(attributes)。因此,通过status_id =具体设置status_id应该是OK – mikej 2010-01-27 13:14:01

    1

    变化@order.status_id = "1"@order.status_id = 1

    红宝石可能读"1"作为一个字符串(这是应该做的),而不是一个整数(你可能正在寻找)。当你删除引号时,ruby将把它解释为一个整数。如果您必须将其保留为字符串,请尝试类似my_string.to_i"123".to_i

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

    1

    @order.status_id = "1" 
    

    应该

    @order.status_id = 1 
    

    或许

    @order.status = Status.find_by_id(1) 
    

    ,如果你有建立关系很好

    相关问题