Programing

레일 부분 템플릿의 선택적 로컬 변수 : (정의 된 foo) 혼란에서 어떻게 벗어날 수 있습니까?

lottogame 2020. 4. 25. 09:50
반응형

레일 부분 템플릿의 선택적 로컬 변수 : (정의 된 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] %>

이것은 파블로의 대답에서 파생 된 것입니다. 이를 통해 기본값 ( '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를 값으로 전달할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/2060561/optional-local-variables-in-rails-partial-templates-how-do-i-get-out-of-the-de

반응형