Ruby on Rails에서 뷰에 인스턴스 변수를 사용하지 말 것을 제안하는 이유는 무엇입니까?


12

컨트롤러와 뷰 사이에서 인스턴스 변수를 공유하는 것이 좋지 않다고 들었습니다. @를 통해 컨트롤러에서 무언가가 오는 것을 즉시 볼 수 있기 때문에 나는 그것을 좋아합니다. : 여기 컨트롤러에서 도우미 사용할 수있는 좋은 방법 참조 http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.html을 . 그러나 나는 그 부분에 cancan을 사용하고 있습니다.

답변:


11

아이디어는 Rails Best Practices에 실 렸습니다 : 인스턴스 변수를 로컬 변수로 교체

기본적으로 많은 부분을 사용하지 않거나 각 컨트롤러 메소드에 대해 단일 일반보기를 갖는 경우보기의 인스턴스 변수 만 사용하면 실제로 아무런 문제가 발생하지 않습니다.

그럼에도 불구하고 많은 부분을 사용하여 컨트롤러에 많은 인스턴스 변수가 선언되어 있다면 컨트롤러 (인스턴스) 변수를 부분적으로 명시 적으로 전달하는 대안을 사용하면 혼동이 줄어 듭니다. 그런 식으로-부분 VIEW에서 작업하는 동안 작업하려는 변수 / 객체에 대한 명시 적 참조가 페이지 작성에 포함 된 'all'부분과 공유되지 않습니다.

결국, 당신은 당신이 그것을 처리하고자하는 것처럼 이것을 처리 할 수 ​​있습니다. 그러나 내 개인적인 견해는 다른 변수와 혼동 할 수없는 부분 /보기에 명시 적으로 참조하는 아이디어를 좋아한다는 것입니다.


5

global참조로 전달 된 변수 또는 변수 에서 유추를 얻을 수 있으며 부분을 ​​함수로 생각할 수 있습니다. 따라서 인스턴스 변수를 사용하는 것은 장점과 단점 모두에 대한 참조로 함수에 전달되는 변수와 매우 비슷합니다.

# controller 
def index
  @var = 1
end

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo' %><br/>
<%= @var %>

#partial _foo.html.erb
<%= @var = 2 %>

결과는

1
2
2

이러한 동작을 원할 수 있지만 대부분의 경우 필요하지 않습니다. 이런 방식으로 버그를 도입하는 것이 더 쉽고 버그를 추적하기가 더 어렵습니다. 이것이 뷰와 부분에 사용 된 변수의 범위를 분리하기 때문에 이것이 권장되는 이유입니다.

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo', var: @var %><br/>
<%= @var %>

#partial _foo.html.erb
<%= var = 2 %>

결과:

1
2
1

2
이것은 좋은 지적이며 변수의 가변성에 대해서는 생각하지 않았습니다. 컨트롤러가 뷰에 변수를 "표시"한다고 가정했지만 인스턴스 변수가 수정되면 버그가 발생할 수 있습니다.
Amala
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.