2010-07-03 3 views
16

내 앱에는 사용자가 요청한 상태를 확인하면서 모든 페이지에 나타나는 작은 상자가 있습니다. 언제든지 요청을 수락하면 사용자는 자동으로 특정 페이지로 이동해야합니다. 이것은 지금까지 내 코드입니다 :RoR의보기에서 redirect_to를 사용할 수 있습니까?

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

하지만이 오류 받고 있어요 :

undefined method `redirect_to' for #<ActionView::Base:0x1042a9770> 

그것이보기에 사용자 redirect_to 할 수 없습니다를? 그렇지 않다면 사용할 수있는 다른 것이 있습니까? 읽어 주셔서 감사합니다.

답변

29

redirect_to은 ActionController :: Base Class의 메소드이므로 ActionView에서 사용할 수 없습니다.

당신은 이메일 매개 변수에

<% if w.accepted == true %> 
    <script type="text/javascript"> 
    window.location.href="/logins/sign_up" // put your correct path in a string here 
    </script> 
<% end %> 

편집을 다음 시도 할 수 있습니다

window.location.href="/logins/sign_up?email=<%= w.email %>" 

그것을 위해 루비에서 아무것도가 있는지 모르겠어요 죄송합니다.

+0

감사합니다. URL을 생성 할 때 RoR 변수를 사용할 수있는 방법이 있는지 알고 계십니까? 위로 가기 내 원래 코드에서 (: email => "[email protected]"), 내가 자바 스크립트 내에서 비슷한 일을 할 수 있을지 모르겠다? – ben

+0

내 수정 된 답변을 확인하십시오. – Salil

+0

정말 고마워요, 작동합니다! 나는 당신이 js에 루비를 내장 할 수 있다고 생각하지 않았지만 분명히 할 수 있습니다. 다시 한 번 감사드립니다! 이 게시물에 대한 – ben

1

redirect_toActionView의 방법이 아닙니다. 그 방법은 ActionController입니다. 페이지로드시 또는 다른 이벤트로 Javascript window.location.href를 사용하여 사용자를 다른 페이지로 안내 할 수 있습니다.

+1

도움을 주셔서 감사합니다. – ben

6

보기의 코드를 redirect_to를 사용할 수 있도록 컨트롤러로 옮길 수 있습니다.

class ApplicationController < ActionController::Base 
    before_action :check_for_accepted_offer 

    def check_for_accepted_offer 
    if Offer.any? { |o| o.accepted } 
     redirect_to offer_path(:email => "[email protected]") 
    end 
    end 
end 

제안이 페이지가로드 될 때 만 평가하기 때문에 도움이 될 답변에 표시된 루비 코드의 사항도 허용되지 않을 때 영업 이익은 즉시 URL을 변경하고자한다면

. 이 질문에 대답하지 않습니다,하지만

window.location.href="/logins/sign_up?email=<%= w.email %>" 

: 영업 이익은 제안이 접수 된 경우 브라우저를 경고하고 자바 스크립트를 다른 대답에 게시 계획을 재 사용하는 설정에 폴링 또는 푸시 전략의 일종 필요 : "어떻게 뷰에서 redirect_to를 사용할 수 있습니까?"이 대답은 궁극적으로 OP에 더 유용 할 것이라고 생각합니다. 리디렉션이 컨트롤러에서 수행되었을 때이 대답을 사용하여 다른 페이지로 리디렉션하는 사람을 우연히 발견했습니다.

0

예,보기에서 controller.redirect_to으로 전화하여 전체 응답을 렌더링하지 않고 클라이언트에서 javascript를 사용하여 새로운 요청을하지 않고도 원하는 결과를 얻을 수 있습니다. 이 controller.redirect_to 당신이 있는지 확인하려면 아마 것이다 당신은 아마 break 원하는 것, 그래서 루프의 탈옥, 그리고하지 않습니다

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% controller.redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

참고 :

당신의 예에서

,이 같을 것이다 나머지보기는 리디렉션하지 않은 경우에만 조건부 렌더링됩니다.

(면책 조항 : 반드시이 기술을 용인하지 않습니다. 다른 사람이 언급 한 것처럼 컨트롤러 나 도우미에서이 작업을 수행하는 것이 좋습니다.)

16

이 방법을 수행 뷰에서 redirect_to를 사용하려면 :

구문 : <퍼센트 controller.redirect_to 경로 %>

예 : <% controller.redirect_to users_profile_path %>

+3

이것은 이것을 더 기본적으로 수행하고 JavaScript를 피할 수있는 좋은 방법입니다! –

+0

내가 이것을 사용할 때 나는 컨트롤러라는 이름이 아니라 '컨트롤러'라는 단어가 필요했다. 이것은 잘 돌아갔다. –

관련 문제