2011-05-23 58 views
1

所以我實施了一個黑客,我想知道什麼是「正確」的方式來做到這一點。PARAMS的順序停止* _attributes =從工作

的問題是,我有一個使用實例變量的*_attributes=()方法。這是一個問題,原因是在調用該方法時,該實例變量尚未設置。這是問題的方法:

def proposed_times_attributes=(attributes) 
    attributes.each do |key,value| 
    value[:timezone] = timezone 
    end 
    assign_nested_attributes_for_collection_association(:proposed_times, attributes) 
end 

的時區是在params哈希表proposed_times_attributes後。因此,我的破解是從params中刪除它,然後將其添加回來,從而將它移動到行的末尾。

def create 
    p = params[:consultation] 
    a = p.delete(:proposed_times_attributes) 
    p[:proposed_times_attributes] = a 

    @consultation = current_user.advised_consultations.new(p) 
    ... 
end 

什麼是正確的方法,我應該這樣做呢?

new()調用load()其中循環遍歷每個鍵/值對。

謝天謝地,我使用了Ruby 1.9.2,它能夠保持順序,但是知道如何做到這一點,這樣就不會取決於這個事實。

回答

0

如果new之後的下一個操作將始終是一個save操作,可以存儲在一個訪問的屬性,並使用before_validation回調,你想對他們進行操作。

class Consultations < ActiveRecord::Base 

    attr_accessor :proposed_times_attributes 

    before_validation :assign_proposed_times 

    def assign_proposed_times 
    proposed_times_attributes.each do |key,value| 
     value[:timezone] = timezone 
    end 
    assign_nested_attributes_for_collection_association(:proposed_times, attributes) 
    end 

end 

現在在你的控制器,你只需有:

def create 
    @consultation = current_user.advised_consultations.new(params[:consultation]) 
    ... 
end 

如果你想打電話save之前做其他操作,然後拉出帕拉姆因爲你在你的例子一樣,然後將它傳遞給一個打電話給new之後的適當方法就是要走的路。