2011-07-21 36 views
2

Rails 3.0中可能渲染部分名稱存儲在變量中的部分?指定部分要使用變量渲染的鋼軌名稱

我試圖類似的東西:

<%= escape_javascript(raw render :partial => @partial_name, :locals => { :value => @value})%> 

更新了更多的細節

在我的應用我有一組使用多表繼承車型,例如可以說我有一個基礎模型「杯形蛋糕」以及「AwesomeCupcake」和「AlrightCupcake」等變體。

這些模型中的每一個都有自己的顯示信息的自定義部分,並遵循命名方案:'_awesome_cupcake'和'_alright_cupcake'。

在頁面上,我有每種類型的杯形蛋糕的鏈接,我希望控制器接受一個參數並動態地派生出要渲染的部分。如果(在new.js.erb文件中)我用'awesome_cupcake'替換'@partial_name',下面的工作就像想要的一樣。

這裏是一個小的詳細信息到我的組件是如何佈局:

的application.js

$('#set_cupcake').click(function() { 
    $.getScript('/cupcakes/new.js?cupcake_type=awesome'); 
}); 

cupcakes_controller.rb

def new 
    cupcake_type = "#{params[:cupcake_type].capitalize}Cupcake" 

    if Object.const_defined? cupcake_type 
    @cupcake = cupcake_type.constantize.new 
    @partial_name = "#{params[:cupcake_type]}_cupcake" 
    end 
end 

的意見/蛋糕/new.js.erb

$('#cupcakes') 
    .append("<%= escape_javascript(raw render :partial => @partial_name, :locals => { :cupcake => @cupcake }) %>") 
+1

你有什麼問題? – jtbandes

+0

我已經添加了關於我的情況的其他信息。謝謝! – jwarzech

回答

1

所以最後。找出問題所在,在我的控制器中,我將@partial_name設置在一個條件範圍內,模型存在。

我沒有意識到使用Object.const_defined?在開發模式下並不適用於Rails,因爲模型最初並未全部加載。我找到的另一種方法是使用ActiveRecord :: Base.connection.tables搜索數據庫表連接列表。

但是我認爲更好的解決方案是存儲一些文件,該文件爲此參數「註冊」可接受的值。

+0

這將是一件很難追查的事情。獎勵! – rubish

+0

難道你不能從異常中拯救嗎? – axsuul

1

當然。確保@partial_variable是名稱的一個字符串(如「頭」,它會正常工作。

+0

我從一個參數構建一個字符串並將其存儲到@partial_name變量中。我在我的問題中增加了一些額外的細節,希望能夠更好地解釋我正在嘗試做的事情。 – jwarzech

+0

這應該工作。龔錯了什麼? –

+0

我得到的錯誤是:ActionView :: Template :: Error(NilClass:Class的未定義方法'model_name')。如果我硬編碼部分的名稱它的工作原理,但如果我將同一個字符串複製到一個變量我得到一個錯誤。 – jwarzech

0

如果不工作,你能告訴我們到底是什麼@partial_name包含?你得到什麼錯誤?

確保領先下劃線冷落,以及文件擴展名

例如:渲染「_myPartial.html.erb」,@partial_name應該是「myPartial」