2016-08-24 62 views
7

chcę, aby moje app w czasie rzeczywistymJak używać Aplication.renderer.render z szyn 5 z devise

To jest mój błąd

actionView :: Template :: Error (Devise nie mógł znaleźć instancję Warden::Proxy w środowisku żądania: Upewnij się, że aplikacja ładuje program Devise and Warden zgodnie z oczekiwaniami, a oprogramowanie pośrednie Warden::Manager znajduje się w stosie oprogramowania pośredniego. Jeśli widzisz to na jednym z testów, upewnij się, że testy są albo uruchamianie stosu pośredniego Railsów, albo używanie testów moduł Devise::Test::ControllerHelpers do wstrzyknięcia obiektu request.env['warden']).
1: -if user_signed_in?
2: .ui.popup.computer {id: "post # {post.id} user # {post.user.id}", styl: "dopełnienie: 0px"}
3: .ui.card
4: .image

nie wiem co robić

Pomóżcie mi proszę.

+0

nie znalazłem jeszcze odpowiedniego rozwiązania, ale tutaj jest kilka linków FYI: https://evilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions, http://www.thegreatcodeadventure.com/using-action- kontroler-renderers-in-rails-5-with-devise/ – artificis

Odpowiedz

-1

Podczas korzystania z nowego Renderer aplikacji Rails 5 nie jest wykonywane żadne oprogramowanie pośrednie. Devise używa Warden'a i ustawia go jako zmienną środowiskową env ['warden'], a zatem brakuje go podczas wywoływania renderera. To jest powód, dla którego pojawia się ten błąd.

Aby to zadziałało, w kontrolerze wystarczy użyć funkcji before_action dla kontrolera #, która zostanie wykonana, aby ustawić i przekazać zmienną instancji do widoku.

Jeśli chcesz sprawdzić, czy użytkownik jest zalogowany lub użyj current_user w wytopione widzenia:

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 

Następnie w widoku ExamplesController # show:

# views/examples/show.html.erb 

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

nadzieję, że pomoże

+0

Myślę, że Problem e-pytającego pochodzi od tego, który próbuje renderować szablony poza kontrolerem. – artificis

0

Myślę, że znalazłem rozwiązanie dla mojej sprawy.

Należy zdefiniować metodę klasy renderer_with_signed_in_user w 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 

a następnie można uczynić z innych części aplikacji Rails, na przykład:

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

kredytowej do Stefana Wienert dla jego article