2013-10-20 1 views
2

저는 컨트롤러에서 인스턴스 변수를 관리하는 것에 압도되어 있으므로이를 관리하는 더 좋은 방법이 있다고 생각합니다.레일즈 컨트롤러의 인스턴스 변수를 패키지합니까?

내 상황은 프런트 페이지 렌더링을 처리하는 PagesController입니다. 첫 페이지에는 원래 다른 컨트롤러에 속한 여러 개의 작은 폼이 있습니다 (예를 들어 새 폼을 만들고 PostsController가 전용이지만 편의상 앞 페이지에서 쉽게 게시물을 만들 수 있습니다). 폼을 유지하기 위해 모두 해당 인스턴스 변수가 필요합니다 (예 : 새 게시 양식에 @post 객체가 필요함).

이 이렇게 많은 줄은 단지

@post = Post.new # similar for other objects 
@some_other_var = OtherController.new # another one 
@one_more = AnotherController.new # again 
# even more @variables here when the website is big 

이 충분히 나쁜하지 못하는 경우가, 내가 수동으로 양식 작업을하기 위해 내 PagesController#index에이 인스턴스 변수를 추가 할 필요가 있음을 나에게 밝혀 create 또는 edit 작업이 실패하면 (예 : 유효성 검사를 통과하지 못했음) 생각하고 이전 페이지를 렌더링해야합니다. 우리는이 라인을 다시 추가해야합니다. 렌더가있을 때마다 실제로 모든 변형을 포함시켜야합니다.

이러한 코드를 필요한 모든 작업에 수동으로 입력하는 것은 매우 번거롭고 웹 사이트가 복잡 해지면 하나 또는 두 개를 놓치기 쉽습니다.

그래서 우리는 같은 코드를 매번 쓰는 대신 한 번만 포함시켜야하므로 이러한 변수를 관리하는 더 좋은 방법이 있는지 궁금합니다.

답변

2

당신은 같은 before_filter 뭔가를 만들 수 있습니다

class ApplicationController < ActionController::Base 
    ... 
    ... 
    protected 

    def instance_variables_for_form 
     @post = Post.new # similar for other objects 
     @some_other_var = OtherController.new # another one 
     @one_more = AnotherController.new # again 
     # even more @variables here when the website is big 
    end 

    end 

을하고 좋아 사용

class PagesController < ApplicationController 
    before_filter :instance_variables_for_form, only: [:action] 
    ... 
    ... 
    end 

을하고 필요할 때마다 당신은 어떤 행동도 너무 명시 적으로 호출 할 수 있습니다.

관련 문제