回答:
現在、私はRails 3 / 3.1プロジェクトで以下を使用しています。
lookup_context.find_all('posts/_form').any?
私が見た他のソリューションに対する利点は、これがレールのルートだけでなく、すべてのビューパスを調べることです。私はたくさんのレールエンジンを持っているので、これは私にとって重要です。
これはRails 4でも機能します。
lookup_context.exists?("find", lookup_context.prefixes, true)
。この方法では、ビューディレクトリを呼び出しにハードコードする必要はありません。これはパーシャルのためのものであることに注意してください。部分的でない場合は、最後の引数を省略します(またはtrueの代わりにfalseを使用します)
私もこれで苦労していました。これは私が最終的に使用した方法です:
<%= render :partial => "#{dynamic_partial}" rescue nil %>
基本的に、パーシャルが存在しない場合は何もしません。しかし、パーシャルが欠落している場合は何かを印刷しましたか?
編集1:ああ、私は読解に失敗します。あなたは何か他のものをレンダリングしたいと言っていました。その場合、これはどうですか?
<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>
または
<%= render :partial => "#{dynamic_partial}" rescue "Can't show this data!" %>
編集2:
代替方法:部分ファイルの存在を確認します。
<%= render :partial => "#{dynamic_partial}" if File.exists?(Rails.root.join("app", "views", params[:controller], "_#{dynamic_partial}.html.erb")) %>
rescue nil
および... rescue ...
メソッドはそれを非表示にします。これはデバッグが難しいバグにつながります。
ビュー内から、template_exists?機能しますが、呼び出し規約は単一の部分的な名前の文字列では機能せず、代わりにtemplate_exists?(name、prefix、partial)を取ります
パスの一部を確認するには:app / views / posts / _form.html.slim
使用する:
lookup_context.template_exists?("form", "posts", true)
Rails 3.2.13では、コントローラーを使用している場合、これを使用できます。
template_exists?("#{dynamic_partial}", _prefixes, true)
template_exists?
lookupcontext
あなたが見ることができるように、に委任されていますAbstractController::ViewPaths
_prefixes
コントローラの継承チェーンのコンテキストを提供します。
true
パーシャルを探しているからです(通常のテンプレートが必要な場合は、この引数を省略できます)。
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
。これにより、このレイアウトをレンダリングする現在のテンプレートに「navbar」パーシャルが指定されているかどうかがわかり、もしあれば、レンダリングできます。私:partial
はそのブール値が何であるかを明確にするために単に:partial
渡します- 真実です。_prefixes
ビットをありがとう、@ Flackou!
_prefixes
とnil
、あなたが別の親ディレクトリにそれの部分を呼び出している場合。
私はこれが答えられて、百万年前のものであることを知っていますが、これが私のためにこれを修正することになった方法です...
Rails 4.2
まず、これを私のapplication_helper.rbに入れます
def render_if_exists(path_to_partial)
render path_to_partial if lookup_context.find_all(path_to_partial,[],true).any?
end
そして今、呼び出す代わりに
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
私は電話するだけです <%= render_if_exists "#{dynamic_path}" %>
お役に立てば幸いです。(rails3では試していません)
def render_if_exists(*args); render(*args) if ...
そのために
私は多くの場面でこのパラダイムを使用して大きな成功を収めてきました。
<%=
begin
render partial: "#{dynamic_partial}"
rescue ActionView::MissingTemplate
# handle the specific case of the partial being missing
rescue
# handle any other exception raised while rendering the partial
end
%>
上記のコードの利点は、2つの特定のケースを処理できることです。
コード<%= render :partial => "#{dynamic_partial}" rescue nil %>
または一部の派生物を使用する場合、パーシャルは存在する可能性がありますが、例外が発生します。これは黙って食べられ、デバッグの痛みの原因になります。
rescue
は危険です。使用する前に、他のソリューションを確認します。