문제

ERB 위에 쓰여진 꽤 오래된 템플릿 시스템이 있습니다. 데이터베이스에 저장된 ERB 템플릿에 의존합니다. 그것들은 읽고 렌더링됩니다. 한 템플릿에서 다른 템플릿으로 데이터를 전달하려면 다음을 사용합니다. Locals 매개 변수는 레일 렌더링 방법을 사용합니다. 일부 템플릿에서 해당 변수의 기본 변수를 설정하려면 정의 된 것을 사용합니까? 로컬 변수가 정의되었는지 간단히 알려주는 메소드와 그렇지 않은 경우 다음과 같은 기본값으로 초기화합니다.

unless defined?(perex)
  perex = true
end

앱을 최신 레일로 업그레이드하고 이상한 행동이 보입니다. 기본적으로 이것은 때때로 작동하며 (때로는 Perex가 정의되지 않음) 때로는 그렇지 않습니다 (Perex가 정의되어 NIL로 설정됨). 이것은 다른 변화없이 발생합니다.

두 가지 질문이 있습니다. 정의를 사용하는 것 외에 다른 방법이 있습니까? 신뢰할 수없는 것을 증명하는 것은 무엇입니까 (최고 레일 1.6에서 몇 년 동안 신뢰할 수 있습니까)? 그러한 방식으로 모든 템플릿을 다시 작성하지 않아야합니다. 나는 루비 문서를 겪고 있었고 정의 된 것에 대해 아무것도 찾을 수 없었습니까? 방법. 더 이상 사용되지 않았습니까? 아니면 단지 평범한 장님입니까?

편집하다: 실제 문제는 루비/ERB 버그로 보이는 것으로 발생했습니다. 때때로 ~하지 않는 한 진술은 효과가 있지만 때로는 그렇지 않습니다. 이상한 점은 두 번째 줄이 실행 되더라도 Perex Stil은 나머지 세계에 머물 렀습니다. 정의 된 제거? 그것을 해결했습니다.

도움이 되었습니까?

해결책

첫째 : 실제로, defined? 운영자입니다.

둘째 : 귀하의 질문을 올바르게 이해한다면,이 루비 관용구와 관련이 있습니다.

perex ||= true

그것은 true에 할당됩니다 perex 정의되지 않은 경우 또는 nil. 값이있을 때 과제를 평가하지 않기 때문에 예제가하는 것이 정확히 아닙니다. nil, 그러나, 당신이 그것에 의존한다면, 내 생각에, 그것을 보지 않고, 당신은 명확한 코드를 쓰지 않습니다.

편집하다: Honza가 언급했듯이 위의 진술은 perex 그럴 때 false. 그런 다음 다음을 제안합니다. 최소 줄 수를 다시 작성할 수 있습니다.

perex ||= perex.nil?  # Assign true only when perex is undefined or nil

다른 팁

로컬이 레일 템플릿에 정의 된 경우 가장 안전한 테스트 방법은 다음과 같습니다.

local_assigns[:perex]

이것은 Rails API에 설명되어 있습니다. defined? 구현 제한으로 인해 사용할 수 없습니다.

Mislav의 대답에 따라, 나는 Rails API에서 그 문서를 찾아서 그것을 발견했습니다. Class ActionView :: Base (제목 아래에서 "로컬 변수를 서브 템플릿으로 전달"). 그러나 Mislav보다 더 많은 것을 말하지 않았기 때문에 수색의 가치는 거의 없었습니다. 이 패턴을 권장한다는 점을 제외하고 :

if local_assigns.has_key? :perex

고려자 Mislav의 원래 대답 그리고 Kenb의 정교함, 나는 다음이 절대적인 최선의 접근법이라고 생각합니다 (나는 의견에 열려 있지만). 루비를 사용합니다 해시#페치 원래 해시에 키가 존재하지 않으면 대체 값으로의 폴백 방법.

perex = local_assigns.fetch(:perex, true)

이것은보다 훨씬 낫습니다 ||= 대부분의 사용자가 제안 할 방법은 때때로 허용하기를 원하기 때문에 false 가치. 예를 들어, 다음 코드가됩니다 절대 허용 false 통과 할 값 :

perex = local_assigns[:perex] || true
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top