[ruby-on-rails] 부분이 존재하는지 확인하는 Rails 함수가 있습니까?
존재하지 않는 부분을 렌더링하면 예외가 발생합니다. 렌더링하기 전에 부분이 존재하는지 확인하고, 존재하지 않는 경우 다른 것을 렌더링하겠습니다. .erb 파일에서 다음 코드를 수행했지만이 작업을 수행하는 더 좋은 방법이 있어야한다고 생각합니다.
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
답변
현재 저는 Rails 3 / 3.1 프로젝트에서 다음을 사용하고 있습니다.
lookup_context.find_all('posts/_form').any?
내가 본 다른 솔루션에 비해 장점은 레일 루트가 아닌 모든 뷰 경로에서 볼 수 있다는 것입니다. 레일 엔진이 많기 때문에 이것은 나에게 중요합니다.
이것은 Rails 4에서도 작동합니다.
답변
나도 이것으로 고군분투하고 있었다. 이것은 내가 사용한 방법입니다.
<%= 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")) %>
답변
뷰 내부에서 template_exists? 작동하지만 호출 규칙은 단일 부분 이름 문자열로 작동하지 않고 대신 template_exists? (이름, 접두사, 부분)를 사용합니다.
경로에서 부분을 확인하려면 : 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
부분을 찾고 있기 때문입니다 (일반 템플릿을 원한다면이 인수를 생략 할 수 있습니다).
답변
나는 이것이 답을 얻었고 백만 년이라는 것을 알고 있지만, 여기에 내가 이것을 어떻게 고쳤는지가 있습니다 …
레일즈 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에서 시도하지 않았습니다)
답변
저는이 패러다임을 여러 번 사용하여 큰 성공을 거두었습니다.
<%=
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
%>
위 코드의 이점은 특정 경우를 견인 할 수 있다는 것입니다.
- 부분이 실제로 누락되었습니다.
- 부분이 존재하지만 어떤 이유로 오류가 발생했습니다.
코드 <%= render :partial => "#{dynamic_partial}" rescue nil %>
나 일부 파생물 만 사용하면 부분이 존재할 수 있지만 예외가 발생하여 조용히 먹히고 디버깅을위한 고통의 원인이됩니다.
답변
자신의 도우미는 어떻습니까?
def render_if_exists(path, *args)
render path, *args
rescue ActionView::MissingTemplate
nil
end