2008-10-10 73 views
2

我有一個控制器方法,它返回一個下拉列表,在部分渲染中呈現,但取決於部分的使用位置,RJS模板需要不同。我可以將參數傳遞給控制器​​,以確定哪個RJS被使用?如何從同一軌道控制器使用不同的RJS模板?

這裏是控制器的方法,這是很簡單的:

def services 
    respond_to do |format| 
    format.js { 
     @type  = HospitalCriteria.find_by_id(params[:type_id]) 
     @services = @type.children.all 
    } 
    end 
end 

這裏是RJS模板化就會自動呈現

page.replace_html 'select_service', :partial => 'hospital/services' 
page.replace_html 'select_condition', :partial => 'hospital/conditions' 
page.replace_html 'select_procedure', :partial => 'hospital/procedures' 

page << 'if ($("chosenType") != null) {' 
    page.replace_html 'chosenType', @type.name 
    page.replace_html 'chosenService', 'Selected Service' 
    page.replace_html 'chosenCondition', 'Selected Condition' 
    page.replace_html 'chosenProcedure', 'Selected Procedure' 
page << '}' 

回答

2

把條件邏輯放在一個 rjs模板怎麼樣?

# services.rjs 

if @type == "your conditions" 
    # your rjs updates 
else 
    # your other rjs updates 
end 

這給你一個更乾淨的控制器,並節省你頭痛的維護多個rjs模板。

+0

所有的解決方案的工作,但我認爲這是最乾淨的。 – 2008-10-15 02:37:40

1

類似:

if params[:use_alternate] 
    render :template => alternate.rjs and return 
end 
3

我就像邁克的迴應一樣,但從設計的角度來考慮一下:

這聽起來對我來說應該是在視圖層 - 如果動作在語義上是相同的,但演示文稿是不同的,也許有兩個不同的rjs partials,並做類似下面的事情更符合MVC?

if params[:use_alternate] 
    render :partial => "case_1.rjs" 
else 
    render :partial => "case_2.rjs" 
end 
0

爲了保持乾淨,我有兩個控制器方法來渲染兩個不同的RJS。然後,我將在兩個控制器方法調用的通用受保護方法中設置@type和@services。

在我看來,你在每種情況下都要求不同的東西,所以調用不同的控制器方法。傳遞一個標誌來改變方法的工作方式只是一種破解,當你有3,4或5個地方時不會很好地擴展。即使您會生成更多代碼,維護起來也會更容易。

相關問題