Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby on Rails 7.1:부분적으로 엄격한 지역 변수 마스터하기

Rails 부분은 수년 동안 사용되어 왔지만 지원 객체 구조가 없는 ERB 스니펫에 불과하기 때문에 투박할 수 있습니다.

최근 ViewComponent 및 Phlex와 같은 라이브러리는 템플릿에 더 많은 의미 구조를 추가하여 뷰 계층을 개선하려고 시도했습니다. 이것들은 훌륭한 도서관이며 개인적으로 ViewComponent에 도달합니다. 내가 작업하는 거의 모든 프로젝트에서. 그렇긴 하지만, 저는 여전히 소박한 Rails 부분이 많은 사용 사례에서 훌륭하게 작동한다고 생각합니다.

Rails 팀은 항상 제품 개선을 위해 노력하고 있으므로 Rails 7.1에 도입된 새로운 기능인 엄격한 로컬을 살펴보겠습니다.

레일 부분 및 지역 변수

임의의 지역 변수를 Rails 부분 변수에 전달할 수 있으며 마법처럼 사용할 수 있습니다.

 

큰 마크업 블록이 있는 경우 부분이 어떤 변수를 허용하는지 확인하기가 까다롭기 때문에 이는 이상적이지 않습니다. 또한 변수는 동적으로 생성되므로 누락된 변수는 nil를 반환하지 않습니다. 하지만 오류가 발생합니다.

icon라고 가정해 보겠습니다. 위 부분에서는 선택 사항입니다:

 

우리는 그것을 다음과 같이 렌더링합니다:

 

그러면 ActionView::Template::Error이 올라갑니다. , 메시지 undefined local variable or method 'icon' for #<ActionView::Base:0x00000000023078> 포함 .

icon이라는 사실 선택 사항이라는 것이 독자에게도 명확하지 않습니다. Rails 7.1까지의 해결책은 local_assigns를 검사하는 것이었습니다. 삽입된 모든 지역 변수를 포함하는 해시입니다.

 

이는 icon 때문에 위의 오류를 수정합니다. 이제 변수는 항상 설정됩니다.

Rails 7.1은 엄격한 지역 개념을 사용하여 부분 지역 변수의 단점을 해결하려고 시도합니다. .

Rails에서 엄격한 로컬이란 무엇인가요?

Rails 7.1부터 부분 상단에 매직 주석을 작성할 수 있습니다. 이 주석은 허용되는 지역 변수와 기본값을 정의합니다.

 

Rails는 이 주석을 구문 분석하고 정의된 변수를 부분적으로 설정합니다. 이제 부분이 허용하는 변수와 기본값이 독자에게 분명해졌습니다.

부분은 위와 같이 계속 렌더링되어야 합니다. title를 제외해 보세요. 호출 사이트의 변수를 가져와서 무슨 일이 일어나는지 확인하세요:

 

ArgumentError를 받았습니다. missing local: :title 메시지와 함께 :이전보다 더 설명적인 오류 메시지가 나타납니다!

엄격한 지역을 사용해야 하는 경우

엄격한 로컬은 까다로울 수 있으므로 이를 사용하는 것이 항상 좋은 생각은 아닙니다. 특히 레거시 앱에서는 더욱 그렇습니다.

엄격한 현지인에게 적합한 사용 사례를 살펴보겠습니다. 카드에 사용자 세부정보를 표시하는 부분이 있다고 가정해 보겠습니다. , 그러나 마지막으로 로그인한 시간은 관리자만 볼 수 있습니다.

 

이 부분은 여러 변수를 사용하고 선택적 변수를 가지므로 엄격한 지역 주민에게 완벽한 사례입니다. 파일에 다음과 같은 마법 주석을 추가하면 훑어보기가 훨씬 쉬워집니다.

 

모델과 관련된 부분(예:posts/_post.html.erb)의 경우 ), 그러한 부분이 단일 post을 허용한다는 것은 매우 분명합니다. 변수. 저는 엄격한 현지인이 이러한 경우에 반드시 좋은 생각은 아니라고 생각합니다.

엄격한 현지인 문제

주의해야 할 몇 가지 문제가 있으므로 전반적으로 엄격한 로컬을 사용하지 않는 것이 좋습니다.

암시적으로 컬렉션 렌더링

컬렉션을 암시적으로 렌더링하는 경우:

 

Rails는 _post을 주입합니다. post 외에 두 개의 변수가 있는 부분 변수. Rails 7.1.2 이전에는 오류를 방지하기 위해 수동으로 정의해야 했습니다:

 

이 문제는 Rails 7.1.2에서 해결되었으며 이제 이러한 변수는 선택 사항입니다(그러나 필요한 경우 존재한다는 것을 알아 두는 것이 좋습니다)!

ActionCable을 통한 방송

ActiveRecord 콜백에서 ActionCable을 통해 부분을 브로드캐스트하는 경우:

 

request_id를 지정해야 합니다. 기본값이 nil인 지역 변수 , 이는 Rails에서 내부적으로 사용되기 때문입니다.

 

그렇지 않으면 콜백이 실행될 때 오류가 발생합니다.

이로써 우리의 잠깐의 투어가 끝났습니다!

유념해야 할 몇 가지 사항

기존 부분에 엄격한 로컬을 추가하는 것은 전부 아니면 전무입니다. 주어진 파일에 대한 제안. 변수를 찾으면 매직 코멘트에 변수를 점진적으로 추가할 수 없습니다. 위의 문제에서 볼 수 있듯이 매직 주석에서 선언해야 하는 모든 변수를 확인하는 것은 까다로울 수 있습니다.

엄격한 로컬을 사용하여 코드를 추론하는 것이 얼마나 쉬운지 고려할 때 새 앱에서 광범위하게 사용할 가치가 있다고 생각합니다(그리고 점진적으로 기존 앱에 소급하여 추가).

레거시 앱의 테스트 모음이 엄격한 로컬을 추가하는 부분을 포함하는지 확인하는 것이 중요합니다. 생략하면 예외가 발생하므로 변경 사항을 배포하기 전에 모든 사용 사례를 테스트했는지 확인해야 합니다.

저는 마법의 댓글을 그다지 좋아하지는 않지만 저는 주석에 기능이 있어서는 안 된다고 생각하기 때문에 엄격한 로컬이 Rails에 큰 도움이 된다고 생각합니다. 부분적으로 로컬을 할당하는 것은 항상 까다로웠으며 이로 인해 작업이 더 쉬워졌습니다. 문제를 조심하세요!

마무리

이번 포스팅에서는 Rails 7.1의 엄격한 로컬에 대해 간략하게 살펴보았습니다. 엄격한 지역 변수를 사용해야 하는 시기와 몇 가지 문제를 알아보기 전에 부분 변수와 지역 변수가 어떻게 작동하는지 살펴봤습니다.

즐거운 코딩 되세요!

추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!

Ruby on Rails 7.1:부분적으로 엄격한 지역 변수 마스터하기

아유시 뉴아티아

객원 저자인 Ayush는 프리랜스 Ruby and Rails 개발자입니다. 그는 The Rails 및 Hotwire Codex의 저자이자 Bridgetown 핵심 팀의 일원입니다. 그는 또한 Scattergun이라는 개인정보 보호에 중점을 둔 메일링 리스트 앱을 운영하고 있습니다.

Ayush Newatia의 모든 기사