2009-10-12 48 views
0

我試圖使屬性等於預定值,而且我不確定是否可以高效地使用以下(在我的訂單控制器中) :Ruby on Rails:在控制器(或可能是模型)中等價物品

def create 
    @order = Order.find(params[:id]) 
    @order.price = 5.99 
    @order.representative = Product.find(params[:product_id]).representative 
    @order.shipping_location = SHIPPING_LOCATION 
    @order.user = current_user 

    respond_to do |format| 
    ... 
    end 
end 

有沒有一種更有效的方法來在Rails(也許使用模型)中等同屬性?如果我使用兩個不同的控制器,是否重複上面爲新控制器所做的操作?

回答

3

在模型中使用before_create回調來分配默認值。

3

你的代碼有點不對,它看起來像是一個控制器爲創建操作,但代碼讀取像它的更新。

無論如何... 您可以使用參數散列一次更新所有內容。

的情況下,你要創建:

order_update = {:price => 5.99, :representative => 
    Product.find(params[:product_id]).representative, 
    :shipping_location => SHIPPING_LOCATION, 
    :user => current_user} 

@order = Order.new(order_update) 

在這種情況下,你要更新:

@order.update_attributes(order_update) #attempts to save. 

混合到你的控制器代碼,我們得到:

def create 
    @order = Order.find(params[:id]) 
    order_update = {:price => 5.99, :representative => 
    Product.find(params[:product_id]).representative, 
    :shipping_location => SHIPPING_LOCATION, 
    :user => current_user}  

    respond_to do |format| 
    if @order.update_attributes(order_update) 
     # save succeeded. Redirect. 
    else 
     # save failed. Render with errors. 
    end 
    end 
end 
0

另一種解決方案:

class Example < ActiveRecord::Base 
    DEFAULTS = HashWithIndifferentAccess.new(:some => 'default', :values => 'here') 

    def initialize(params = {}) 
    super(DEFAULTS.merge(params)) 
    end 
end 

要麼使用初始化和合並參數,要麼像使用before_create一樣使用ActiveRecord鉤子等。

相關問題