2011-07-21 2 views
2

Rails 3.0では、パーシャルの名前が変数に格納される部分をレンダリングすることは可能ですか?私は似た何かをしようとしています変数を使用してレンダリングするためのレールの名前を指定する

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

詳細私のアプリケーションで

を例は、私が持って言うことができますのために、私は、マルチテーブル継承を使用してモデルのセットを持っていると更新ベースモデル「カップケーキ」、「AwesomeCupcake」や「AlrightCupcake」などの変形があります。

これらのモデルのそれぞれは、情報を表示するための独自のカスタムパーシャルを持ち、 '_awesome_cupcake'と '_alright_cupcake'の命名規則に従います。

ページには、コントローラがパラメータを受け取り、どの部分をレンダリングするかを動的に派生させたいカップケーキの各タイプへのリンクがあります。以下は、(new.js.erbファイル内で) '@partial_name'を 'awesome_cupcake'のようなものに置き換えた場合に必要です。

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を使用していることに気付きませんでしたか?モデルが最初にロードされていないので、開発モードのレールでは実際には機能しません。私が見つけた別のアプローチは、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」でなければなりません

関連する問題