레일 부분 템플릿의 선택적 로컬 변수 : (정의 된 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] %>
이것은 파블로의 대답에서 파생 된 것입니다. 이를 통해 기본값 ( 'full')을 설정할 수 있으며 결국 'mode'는 local_assigns 및 실제 로컬 변수에 설정됩니다.
haml / slim :
- mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full')
erb :
<% mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full') %>
보다 직관적이고 컴팩트 한
<% some_local = default_value unless local_assigns[:some_local] %>
호출 할 때마다 로컬 변수를 부분적으로 전달하지 않으려면 다음을 수행하십시오.
<% local_param = defined?(local_param) ? local_param : nil %>
이렇게하면 undefined variable
오류 를 피할 수 있습니다 . 이를 통해 지역 변수가 있거나없는 부분을 호출 할 수 있습니다.
루비 2.5
어브
가능하지만 범위에서 기본값을 선언해야합니다.
VARIABLE 교체 단어.
# index.html.erb
...
<%= render 'some_content', VARIABLE: false %>
...
# _some_content.html.erb
...
<% VARIABLE = true if local_assigns[:VARIABLE].nil? %>
<% if VARIABLE %>
<h1>Do you see me?</h1>
<% end %>
...
다음과 같이 도우미를 만들 수 있습니다.
somearg = opt(:somearg) { :defaultvalue }
다음과 같이 구현되었습니다.
module OptHelper
def opt(name, &block)
was_assigned, value = eval(
"[ local_assigns.has_key?(:#{name}), local_assigns[:#{name}] ]",
block.binding)
if was_assigned
value
else
yield
end
end
end
방법과 이유에 대한 자세한 내용 은 내 블로그 를 참조하십시오 .
이 솔루션을 사용하면 값을 무시하지 않고 nil 또는 false를 값으로 전달할 수 있습니다.
'Programing' 카테고리의 다른 글
Oracle의 이중 테이블은 무엇입니까? (0) | 2020.04.26 |
---|---|
URL 및 더하기 기호 (0) | 2020.04.26 |
마우스 이벤트 전파 중지 (0) | 2020.04.25 |
SQL Server에서 for-loop의 구문 (0) | 2020.04.25 |
jquery DataTables의 초기 정렬을 비활성화하는 방법이 있습니까? (0) | 2020.04.25 |