2016-08-24 5 views
7
내가 실시간으로 내 응용 프로그램을 만들고 싶어

와 레일 5 Aplication.renderer.render를 사용하는 방법가 유증

이 내 오류

ActionView :: 템플릿 : 오류입니다 (고안은 찾을 수 없습니다 요청 환경의 Warden::Proxy 인스턴스 응용 프로그램이 Devise 및 Warden을 예상대로로드했는지, 미들웨어가 미들웨어 스택에 있는지 확인하십시오. 테스트 중 하나에서 이것을 볼 수 있으면 테스트가 Rails 미들웨어 스택을 실행하거나 테스트가 사용하고 있음 Devise::Test::ControllerHelpers 모듈을 사용하여 request.env['warden'] 개체를 삽입하십시오.
1 : -if user_signed_in?
는 2 : .ui.popup.computer {ID : "포스트 # {post.id} 사용자 # {post.user.id}"스타일 "여백 : 0 픽셀"}
3 :
를 .ui.card 4 : 이미지입니다

내가

이 제발 도와주세요 어떻게해야할지 모르겠어요.

+0

내가 발견하지 않은 적절한 솔루션, 그러나 여기에 몇 가지 링크 FYI가 있습니다 : https://evilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions, http://www.thegreatcodeadventure.com/using-action- 컨트롤러 렌더러 - 인 - 레일 - 5-devise/ – artificis

답변

-1

새로운 Rails 5 Application Renderer를 사용하면 미들웨어가 실행되지 않습니다. Devise는 Warden을 사용하여 environnement 변수 env [ 'warden']로 설정하므로 렌더러를 호출 할 때 누락됩니다. 이것이이 오류를 발생시키는 이유입니다.

컨트롤러를 작동 시키려면 controller # 액션에 before_action을 사용하면됩니다.이 액션은 뷰에 필요한 인스턴스 변수를 설정하고 전달합니다.

당신은 사용자가 로그인되어 있는지 확인하거나, 렌더링 된 뷰에서 CURRENT_USER를 사용해야하는 경우 :

class ExamplesController < ApplicationController 
    before_action :user_logged_in?, only: :show 
    before_action :set_user, only: :show 

def show 
    # whatever the action does 
end 

private 
    def user_logged_in? 
    @user_logged_in = user_signed_in? 
    end 

    def set_user 
    @user = current_user 
    end 
end 

다음보기 ExamplesController 번호 쇼 :

# views/examples/show.html.erb 

<%= "Online" if @user_logged_in %> 
<%= @user.full_name %> 

희망

을하는 데 도움이
+0

나는 생각한다. questioner의 문제는 제어기 외부에서 템플리트를 렌더링하려고 시도 할 때 발생합니다. – artificis

0

내 경우에 대한 해결책을 찾은 것 같습니다.

클래스 방법을 ApplicationController에 정의하십시오.

class ApplicationController < ActionController::Base 
    ... 
    def self.renderer_with_signed_in_user(user) 
    ActionController::Renderer::RACK_KEY_TRANSLATION['warden'] ||= 'warden' 
    proxy = Warden::Proxy.new({}, Warden::Manager.new({})).tap { |i| 
     i.set_user(user, scope: :user) 
    } 
    renderer.new('warden' => proxy) 
    end 
    ... 
end 

그리고이 같은 레일 응용 프로그램의 다른 부분에서 렌더링 할 수 있습니다 아직

renderer = ApplicationController.renderer_with_signed_in_user(user) 
renderer.render template: 'notifications/show', layout: false, locals: { foo: 'bar' } 

신용 스테판 Wienert 그의 article

관련 문제