2014-09-23 7 views
0

부분적인 Ruby Slim 템플릿을 렌더링하면 엔진 블록에 약간의 도우미 메소드가 포함되어 있습니다. 고장난 예 : 여기Ruby Slim : Ruby 엔진 블록에서 로컬 할당에 액세스합니다.

ruby: 
    def new_record_form? 
    object.new_record? 
    end 

, object 일반 슬림 코드에 사용되지만, 엔진 블록의 문맥 내에서 액세스 할 수없는 수있는 로컬 변수가 할당된다. 또한 local_assigns도 사용할 수 없습니다. 이러한 블록 내의 부분에 전달 된 변수에 액세스하는 방법은 무엇입니까?

답변

2

이것은 Ruby의 일반적인 동작입니다.이 방법으로 범위 밖의 로컬 변수에 액세스 할 수는 없습니다. 실제로 이러한 메서드를 사용하는 것은 매우 드뭅니다. 클래스, 예컨대 : 여기

class Foo 
    object = 7 

    # use object in some way in defining the class... 

    def bar 
    # object not available here 
    puts object 
    end 
end 

object에 액세스 할 수있는 방법이 없습니다 bar 방법을 정의 할 때

당신은 그런 일을 볼 수 있습니다.

def foo 
    object = 7 

    def bar 
    puts object 
    end 

end 

을하지만이 같은 중첩 된 방법은 아닙니다주의 :

루비는 또한 당신의 슬림 코드를 컴파일 할 때 귀하의 경우에는 무슨 일이 일어나고 있는지에 가까운있는이 같은 구문을 수 있습니다 foo을 호출하면 동일한 개체에 bar이 정의되지만 에는 object 변수를 사용할 수없고 bar을 호출하면 오류가 발생합니다.

이와 같은 내부 메소드에서 변수에 액세스하려면 인스턴스 변수 여야합니다. 예를 들면 다음과 같습니다.

- @object = ... 
ruby: 
    def new_record_form? 
    @object.new_record? 
    end 

일반적인 조언은 템플릿의 실제 코드를 최소한으로 유지하는 것입니다. 이 메소드를 도우미로 옮길 수도 있습니다 - 인스턴스 변수는 거기에서 사용할 수 있습니다.

+0

범위 지정은 나에게 분명했지만 문제를 해결하기 위해 슬림 처리의 컨텍스트에서 범위가 어떻게 배열되었는지 확실하지 않았습니다. 이 특별한 경우에 도우미가 많은 의미를 가지지 않는 이유에 대해 자세히 설명하지는 않더라도 인스턴스 변수 솔루션은 좋은 접근 방법으로 보입니다. 감사! –