[ruby-on-rails] 레일 부분 템플릿의 선택적 로컬 변수 : (정의 된 foo) 혼란에서 어떻게 벗어날 수 있습니까?
나는 나쁜 아이였으며 부분 템플릿을 렌더링 할 때 : locals 해시에 값이 명시 적으로 정의되지 않은 경우 부분 템플릿에서 다음 구문을 사용하여 로컬 변수의 기본값을 설정했습니다.
<% foo = default_value unless (defined? foo) %>
이것은 통과되지 않은 변수가 정의되지 않은 것이 아닌 nil로 정의 된 것처럼 행동하기 시작한 이유가 무엇인지 알 수없는 최근까지도 잘 작동하는 것처럼 보였습니다.
SO에서 다양한 도움을받은 사람들이 지적했듯이 http://api.rubyonrails.org/classes/ActionView/Base.html 은 사용 하지 말라고 합니다.
defined? foo
대신에
local_assigns.has_key? :foo
내 방식을 수정하려고하지만 많은 템플릿을 변경하는 것을 의미합니다.
미리 청구하고 모든 템플릿에서이 변경을 수행 할 수 있습니까? 주의해야 할 까다로운 점이 있습니까? 각 테스트를 얼마나 부지런히해야합니까?
답변
나는 이것을한다:
<% some_local = default_value if local_assigns[:some_local].nil? %>
답변
local_assigns
해시 이므로 fetch 를 optional과 함께 사용할 수도 있습니다 default_value
.
local_assigns.fetch :foo, default_value
설정되지 않은 default_value
경우 반환 됩니다 foo
.
경고:
어쨌든 결과를에 전달하기 위해 호출되므로 local_assigns.fetch :foo, default_value
when default_value
가 메소드 인 경우 주의하십시오 fetch
.
당신이 경우 default_value
방법은, 당신은 블록을 포장 할 수 있습니다 local_assigns.fetch(:foo) { default_value }
필요하지 않을 때의 호출을 방지하기 위해.
답변
어때요?
<% foo ||= default_value %>
” foo
아니오가 아니면 참이면 사용합니다. 그렇지 않으면 default_value
foo에 할당 합니다 “라고 말합니다 .
답변
나는 이것이 http://api.rubyonrails.org/classes/ActionView/Base.html 에서 반복되어야한다고 생각한다 .
특정 로컬 변수에 특정 렌더 호출에서 값이 할당되었는지 확인해야하는 경우 다음 패턴을 사용해야합니다.
<% if local_assigns.has_key? :headline %>
Headline: <%= headline %>
<% end %>
정의를 사용한 테스트? 헤드 라인이 작동하지 않습니다. 이것은 구현 제한 사항입니다.
답변
내 경우에는 다음을 사용합니다.
<% variable ||= "" %>
내 부분에.
그게 좋은지 모르겠지만 내 생각은 괜찮습니다.
답변
나는 오래된 스레드하지만 여기 내 기부 알고 : 내가 사용하는 것이 local_assigns[:foo].presence
A의 조건 부분의 내부. 그런 다음 foo
렌더 호출에 필요할 때만 설정했습니다 .
<%= render 'path/to/my_partial', always_present_local_var: "bar", foo: "baz" %>
테에서 보라 공식 레일 여기 안내 . RoR 3.1.0에서 유효합니다.
답변
여러 기본 변수를 허용하는 더 나은 옵션이라고 생각합니다.
<% options = local_assigns.reverse_merge(:include_css => true, :include_js => true) %>
<%= include_stylesheets :national_header_css if options[:include_css] %>
<%= include_javascripts :national_header_js if options[:include_js] %>