2012-09-01 5 views
2

내가 내가 내가 과정에서 process_cc를 호출 할 때,이 문서를 작성하고 나중에 doc_path로 리디렉션 것을 원하는이레일에서 개인 메서드 호출?

def process 
    @type = params[:type] 
    process_cc(@type) 
end 

private 

def process_cc(type) 
    @doc = Document.new(:type => type) 
    if @doc.save 
    redirect_to doc_path(@doc) 
    else 
    redirect_to root_path, :notice => "Error" 
    end 
end 

과 같은 두 가지 방법이있다. 아마 레일이 처리 할 수없는 동작을 기대하고 있지만 process 메서드는 process_cc 메서드를 호출하지 않고 대신 템플릿을 렌더링하려고합니다 ...

이 정보에 대한 조언이 필요하십니까?

감사합니다.

+4

이 문제는 여전히 당신이'private' 키워드를 제거 할 때인가? 나는 당신의 문제가 사적인 방법과 관련이 있다고 생각하지 않기 때문에 묻습니다. – Robin

+0

당신의 메소드'process_cc'가 호출되지 않았다면, 아마도 서브 클래스의 다른 메소드'process_cc '에 의해 오버라이드 될 것입니다. – Baldrick

답변

-1

당신은 BTW이

class SomeClass 

    private 
    def some_method(arg1) 
    puts "hello from private, #{arg1}" 
    end 
end 

c=SomeClass.new 

c.method("some_method").call("James Bond") 

또는

c.instance_eval {some_method("James Bond")} 

같은 어떤 (단지 개인되지 않음) 메서드를 호출 할 수 코드에서,

self.process_cc(...) 
+0

OP 코드를 보면 실제로 영향을 미치지 않습니다. 한 메소드가 같은 클래스 내에서 private 메소드를 호출하는 경우 명시적인 수신자가 없으므로 해당 메소드가 개인용인지 여부는 중요하지 않습니다. 또한'send ("some_method")'를 사용할 수있을 때 왜 메소드를 proc로 변환할까요? –

3

액션 컨트롤러가 사용하려고 메서드가 마스킹하는 내부 메서드는 process입니다. 귀하의 행동에 대한 다른 이름을 선택하십시오.

5

Object#send은 개체의 모든 방법 (보호 및 개인 정보 포함)에 대한 액세스 권한을 제공합니다.

obj.send(:method_name [, args...]) 
0

변경이 :

def process_cc(type) 
    @doc = Document.new(:type => type) 
    if @doc.save 
    redirect_to doc_path(@doc) 
    else 
    redirect_to root_path, :notice => "Error" 
    end 
end 

에 :

def process_cc(type) 
    @doc = Document.new(:type => type) 
    if @doc.save 
    redirect_to doc_path(@doc) and return 
    else 
    redirect_to root_path, :notice => "Error" and return 
    end 
end