應用程式具有具有重復模式的控制器操作方法。
本質上,在添加或洗掉切換項時,會修改計數器并更改切換狀態。這些方法在一個共同的關注范圍內。
請注意,這些可能不一定是指同一類的物件
這是一種這樣的方法:
def toggle_territory_criteria
if params[:criteria] == "none"
if params[:toggle].to_i == 0
@region_none_active = 0
@regional_total = params[:regional_total].to_i - params[:value].to_i
else
@region_none_active = 1
@regional_total = params[:regional_total].to_i params[:value].to_i
end
else
if params[:toggle].to_i == 0
@active_regionminor_ids.delete(params[:criteria].to_i)
@regional_total = params[:regional_total].to_i - params[:value].to_i
else
@active_regionminor_ids = params[:regionminors] << params[:criteria].to_i
@regional_total = params[:regional_total].to_i params[:value].to_i
end
end
end
這可以通過以下三種方法進行重構和完全抽象:
def toggle_state(attribute)
attribute = false
if params[:toggle].to_i == 0
attribute = true
end
end
def toggle_collection(id_collection, criteria_attribute)
id_collection << criteria_attribute
if params[:toggle].to_i == 0
id_collection.delete(criteria_attribute)
end
end
def toggle_sums(sum_value, original_sum, new_value)
sum_value = original_sum new_value
if params[:toggle].to_i == 0
sum_value = original_sum - new_value
end
end
導致一個簡潔的關注方法
def toggle_territory_criteria_too
if params[:criteria] == "none"
toggle_state(@region_none_active)
toggle_sums(@regional_total, params[:regional_total].to_i, params[:value].to_i)
else
toggle_collection(@active_regionminor_ids, params[:criteria].to_i)
toggle_sums(@regional_total, params[:regional_total].to_i, params[:value].to_i)
end
end
但是,在原始方法和視圖中都無法訪問結果變數(關注方法為此目的使用實體變數)。
執行此重構以服務于控制器操作的正確方法是什么?
uj5u.com熱心網友回復:
在 Ruby(當然也包括 Rails)中,方法永遠不會改變它作為引數接收的物件的值,除非使用了破壞性方法。
例如,在您的情況下,當您運行時toggle_state(@region_none_active),方法toggle_state永遠不會改變@region_none_active。是什么toggle_state做的是只回傳最后執行的線的值,即任一值if params[:toggle].to_i == 0如果是假的或者線的回傳值attribute = true,這是true。attribute在方法中toggle_state是一個區域變數,改變它與@region_none_active.
類似地,該方法toggle_sums 從不更改任何內容,只回傳 Numeric 或false(!),具體取決于一組給定值作為屬性。我相信你不會想要false這個方法的價值!
相反,以下將設定實體變數(在呼叫方一側),例如,@region_none_active在您的關注方法中。
@region_none_active = toggle_state(@region_none_active)
您需要對代碼中的其他方法進行類似的修改。該規范是 Ruby 的基本原則,因此請參閱 Ruby 參考資料或教科書以了解詳細資訊(但我確定您知道這一點?)。
Anf 最后,如果你想@region_none_active從你的視圖中訪問實體變數,你可能需要為它撰寫你自己的 getter 方法,比如
# Your model
attr_reader :region_none_active
# And access it from your model "mdl" like
# mdl.region_none_active
attr_readerRuby 內置別名在哪里
def region_none_active; @region_none_active; end
注意toggle_state,為了清楚起見,我建議按如下方式重寫您的代碼,盡管它所做的與您的代碼相同(并且要補充一點,desired_state?根據 Ruby 的方法名稱約定,該方法的更好名稱類似于):
def toggle_state(attribute)
params[:toggle].to_i == 0
end
另一個注意事項是,這兩種方法id_collection <<和id_collection.delete在您的代碼中都是破壞性的,因此會修改呼叫者的物件。所以你需要小心處理它們。老實說,我不建議在方法中使用這種破壞性的方法,因為直接在用戶方法中更改呼叫者的物件通常會使您的代碼缺乏組織性和難以閱讀。我只在一般情況下堅持使用非破壞性方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/398133.html
標籤:红宝石轨道
