2017-12-20 7 views
0

{CREATE_OID_SCHEMA}가 true인지 여부에 따라 템플릿 변수 {USE_EXISTING_SCHEMA}를 = true 또는 false로 설정하려고 시도했습니다. {CREATE_OID_SCHEMA}의 IF 조건을 지정할 때 == 또는 =를 사용해야합니까?Ruby/chef : IF ELSE 문

case node['fmw']['shortname'] 
     when /oid1/ 
     IS_SECOND_OID_INSTALL = "false" 
     CONFIGURE_OVD_COMPONENT = "true" 
     CREATE_OID_SCHEMA = "true" 
      if CREATE_OID_SCHEMA = "true" then 
      USE_EXISTING_SCHEMA = "false" 
      else USE_EXISTING_SCHEMA = "true" 
     when /oid2/ 
     IS_SECOND_OID_INSTALL = "true" 
     CONFIGURE_OVD_COMPONENT = "false" 
     CREATE_OID_SCHEMA = "false" 
      if CREATE_OID_SCHEMA = "true" then 
      USE_EXISTING_SCHEMA = "false" 
      else USE_EXISTING_SCHEMA = "true" 
    end 

답변

1

연산자 = 연산자는 항상 if 문에서도 대입 연산자입니다. 따라서,

if CREATE_OID_SCHEMA = "true" then 

당신의 문은 항상 CREATE_OID_SCHEMA 상수 문자열 "true"를 할당 (그에서 경고를 출력). 문자열 "true"도 truethy이기 때문에 if 문은 항상 일치합니다. 위의 코드에서

case node['fmw']['shortname'] 
when /oid1/ 
    is_second_oid_install = "false" 
    configure_ovd_component = "true" 
    create_oid_schema = "true" 

    if create_oid_schema == "true" 
    use_existing_schema = "false" 
    else 
    use_existing_schema = "true" 
    end 
when /oid2/ 
    is_second_oid_install = "true" 
    configure_ovd_component = "false" 
    create_oid_schema = "false" 

    if create_oid_schema == "true" 
    use_existing_schema = "false" 
    else 
    use_existing_schema = "true" 
    end 
end 

, 나는 다음과 같이 변경 수행 한 :

다음과 같이 당신은 아마 당신의 코드를 업데이트하려면, 앞으로 if 문에서

  • 를, 내가 사용하는 비교 연산자 == 대신 할당 연산자 =이 필요합니다.
  • Ruby의 변수는 항상 소문자로 시작해야하며 snake_case을 사용해야합니다. 대문자로 시작하는 맨 처음 단어는 루비에서 한 번만 지정해야하는 상수로 간주됩니다.
  • 일반적으로 then 키워드는 사용하지 않아야합니다. 대신 줄 바꿈을 사용하십시오. 더 코드를 업데이트 할 때

, 당신은 진짜 논리 값 대신 단어를 포함하는 문자열 (truefalse)를 사용합니다. 그렇게하면 비교를 단축하고 의도를 더 잘 반영 할 수 있습니다. 일반적으로 falsenil을 제외한 모든 값은 Ruby에서 진정한 의미를 갖습니다 (따라서 if 문에서 일치 함). 여기에는 모든 문자열, 숫자, 정규 표현식이 포함됩니다.

+0

'if' 문은'case'에서 추출 할 수 있습니다. 그럼 당신은 오직 하나만 필요합니다. –