2013-04-07 4 views
1
def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @post } 
    end 
end 

def create 
    @post = Post.new(params[:post]) 
    #something else 
end 

여기서 우리는 실제로 새 페이지를 만들 때 Page.new (params [: page])가 사용되는 create 메서드를 호출하기 때문에 new 메서드는 new.html.erb 뷰를 호출하는 데에만 사용해야합니다. 그렇다면 왜 우리는 여전히 여기에 새로운 방법으로 @post라는 인스턴스 변수가 필요합니까?왜 새 인스턴스 변수가 필요한가요?

+0

'form_for '를 사용하면 객체에 연결된 양식이 생성되므로 새 작업의 경우 빈 양식으로 바뀌지 만 편집 작업에 해당 양식을 재사용하고 기존 Post 객체를로드하면 폼에 관련 필드를로드하십시오. – xkickflip

+0

이미 폼에 연결된 객체가 있으므로 왜 create 메소드에서 Page.new를 다시 사용해야합니까? – ZeroNegOne

+3

'create' 액션의 핸들러는'new' 액션을 위해 호출 된 핸들러와 완전히 다릅니다. 모든 HTTP 요청은 모든 다른 HTTP 요청과 격리 된 새로운 Rails 호출을 트리거합니다. 원래 설정 한 인스턴스 변수는 더 이상 존재하지 않습니다. 새 요청 객체 만 있으면 매개 변수를 다시 처리해야합니다. – Gareth

답변

2

new 또는 다른 모든 작업에서 인스턴스 변수가 필요하지 않지만 기본적으로 Rails의 스 캐 폴딩에서는 인스턴스 변수를 사용합니다. 인스턴스 변수를 사용하면 약간의 이점이 있습니다. 주위에 규칙이 있지만 솔직히 말해서 코드가 엉성하고 기본값이되어서는 안됩니다. 적절한 MVC 프레임 워크에서 컨트롤러의 인스턴스 변수는 뷰 객체에 표시되지 않습니다.

나는, 명시 적 로컬 변수를 사용하고, 지역 주민 등 뷰에 전달할 것을 선호 :

def new 
    post = Post.new 
    respond_to do |format| 
    format.html { render locals: { post: post } } 
    format.json { render json: post } 
    end 
end 

이 더 명시 적으로, 그리고 당신의 의도는 명확합니다. 부분 뷰를 다른 뷰 내부에서 렌더링하기 전에 인스턴스 변수를 설정하는 것에 대해 걱정할 필요가 없기 때문에 뷰는 로컬에서보다 융통성있게됩니다. 데이터를 올바르게 캡슐화하고 post을 조치 외부에 노출시키지 않습니다.

빠른 프로토 타입/스파이크를하려는 경우 인스턴스 변수를 사용하여 문자를 절약 할 수 있지만 코드가 깨끗한 것은 아닙니다.

0

새 인스턴스 변수를 만들지 않았다면 모델이 관리해야하는 데이터를 보유 할 모델이 없을 것입니다. 폼에 보일러 플레이트를 많이 추가 할 필요는 없습니다 모델을 취하는 폼 헬퍼를 사용하는 대신에. 모델을 사용하지 않으면 MVC 프레임 워크를 완전히 사용하지 않게됩니다.

이제 Rails가 위에 구축 된 MVC 구조를 따르는 것이 반드시 필요합니다. 패턴이 필요 없으며, 항상 다른 솔루션이 있습니다.이 작업을 수행하는 데 허용되는 방법은 모델 임에도 불구하고 비어있는 것입니다. create 기능에 사용되는 동안

마지막으로, 나는 모를 때 또는 왜 당신은 new 경로는 일반적으로 객체를 생성하는 양식을 표시하는 데 사용되기 때문에 JSONnew 경로로 응답 할 것 실제로 모델의 새 인스턴스를 만듭니다.

관련 문제