ruby-on-rails
  • ruby
  • 2010-01-27 143 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) 
    

    ,如果你有建立關係很好

    相關問題