2014-10-18 2 views
0

표준 crud 기능이있는 모듈을 만들려고합니다. 이 일을 할 수 있는지, 현명하고, 연습을 하느냐,하지 않겠습니까, 직접 찾아야합니다. 지금까지는 표준 요청 요청을 만들었습니다. 그러나 나는 행동을 생성하고 '스택 레벨 너무 깊은 오류'가 발생하는 구현하려고합니다.스택 레벨을 너무 깊게 만드는 모듈에 crud 액션이 발생했습니다.

class FlagsController < ApplicationController 
    include CrudConcern 

    before_action lambda { crud_index(Flag.all) }, only: :index 
    before_action lambda { crud_new(Flag.new) }, only: :new 
    before_action lambda { crud_create(Flag.new, flags_path) }, only: :create 


    def create 
    end 

end 

침전물 모듈

def crud_create(model, route) 
    variable = model(params) 
    if variable.save 
     flash[:notice] = "Saved!" 
     redirect_to route 
    else 
     flash[:error] = "Try again" 
     render :new 
    end 
    end 

왜이 발생한다? 주위에 방법이 있습니까? Crudify라고 불리는 보석이 있습니다. 그렇게 할 수 있다고 가정합니다.

감사

당신이 아니라 당신의 방법을 기대하는 모델 클래스보다, 모델의 인스턴스를 전달하는 것 같습니다

답변

0

. 난 당신이 대신 다음과 같은 의미 생각 :

# in controller 
before_action lambda { crud_create(Flag, flags_path) }, only: :create 

# in crud module 
def crud_create(model, route) 
    variable = model.new(params) # change is here 
    if variable.save 
    flash[:notice] = "Saved!" 
    redirect_to route 
    else 
    flash[:error] = "Try again" 
    render :new 
    end 
end 

UPDATE

또한 리디렉션 순환 될 수있다. flags_path이 같은 create 방법 (색인과 반대)을 치고있을 수 있으며 계속해서 crud_createbefore_action에 도달하여 stack level too deep 오류가 발생합니다. :)

다시 create 타격 방지하기 위해 테스트 할 리디렉션을 변경하려고하면 redirect_to의 APIDock 항목에서 303로 상태를 설정 할 수 있습니다 :

를 당신이 얻을 이외의 XHR 요청을 사용하는 경우 또는 POST를 실행하고 요청 후 을 리디렉션하면 일부 브라우저는 원래 요청 방법을 사용하여 리디렉션을 따릅니다. 이로 인해 double DELETE와 같은 바람직하지 않은 동작 이 발생할 수 있습니다. 이 문제를 해결하려면 303을 반환 할 수 있습니다. GET 요청을 사용하여 수행 할 기타 상태 코드를 참조하십시오.

예 : redirect_to route, status: 303

+0

는 여전히 같은 오류를 제공합니다. 나는이 변형을 시도했지만 아무 소용이 없다. – user3868832

+0

@ user3868832 다른 답변으로 내 대답을 편집했습니다. – mattmattmatt

관련 문제