[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_valuewhen default_value가 메소드 인 경우 주의하십시오 fetch.

당신이 경우 default_value방법은, 당신은 블록을 포장 할 수 있습니다 local_assigns.fetch(:foo) { default_value }필요하지 않을 때의 호출을 방지하기 위해.


답변

어때요?

<% foo ||= default_value %>

foo아니오가 아니면 참이면 사용합니다. 그렇지 않으면 default_valuefoo에 할당 합니다 “라고 말합니다 .


답변

나는 이것이 http://api.rubyonrails.org/classes/ActionView/Base.html 에서 반복되어야한다고 생각한다 .

특정 로컬 변수에 특정 렌더 호출에서 값이 할당되었는지 확인해야하는 경우 다음 패턴을 사용해야합니다.

<% if local_assigns.has_key? :headline %>
  Headline: <%= headline %>
<% end %>

정의를 사용한 테스트? 헤드 라인이 작동하지 않습니다. 이것은 구현 제한 사항입니다.


답변

내 경우에는 다음을 사용합니다.

<% variable ||= "" %>

내 부분에.
그게 좋은지 모르겠지만 내 생각은 괜찮습니다.


답변

나는 오래된 스레드하지만 여기 내 기부 알고 : 내가 사용하는 것이 local_assigns[:foo].presenceA의 조건 부분의 내부. 그런 다음 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] %>