Как использовать Aplication.renderer.render из rails 5 с devise

Я хочу сделать свое приложение в режиме реального времени

это моя ошибка

ActionView::Template::Error (Devise не удалось найти экземпляр Warden::Proxy в вашей среде запроса. Убедитесь, что ваше приложение загружает Devise и Warden должным образом и что промежуточное ПО Warden::Manager присутствует в вашем стеке промежуточного ПО. Если вы видите это на один из ваших тестов, убедитесь, что ваши тесты либо выполняют стек промежуточного программного обеспечения Rails, либо что ваши тесты используют модуль Devise::Test::ControllerHelpers для внедрения объекта request.env['warden'] для вас.)
1: -if user_signed_in?
2: .ui .popup.computer{id:"post#{post.id}user#{post.user.id}", style:"padding:0px"}
3: .ui.card
4: .image

я не знаю что делать

Помоги мне, пожалуйста.


person Bryan Zamora    schedule 24.08.2016    source источник
comment
Я еще не нашел подходящего решения, но вот несколько ссылок для вашего сведения: evilmartians.com/chronicles/ , thegreatcodeadventure.com/   -  person elquimista    schedule 23.01.2018


Ответы (2)


Кажется, я нашел решение для своего случая.

Определите метод класса renderer_with_signed_in_user в 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, store: false, run_callbacks: false)
    }
    renderer.new('warden' => proxy)
  end
  ...
end

И затем вы можете выполнять рендеринг из других частей приложения Rails, например:

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

Благодарим Стефана Винерта за его статья

person elquimista    schedule 23.01.2018

Когда вы используете новый рендерер приложений Rails 5, промежуточное ПО не выполняется. Devise использует Warden и устанавливает его как переменную окружения env['warden'], поэтому он отсутствует при вызове рендерера. Вот почему вы получаете эту ошибку.

Чтобы заставить его работать, в вашем контроллере просто используйте 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#show :

# views/examples/show.html.erb

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

надеюсь, это поможет

person Mene    schedule 05.09.2016
comment
Я думаю, что проблема спрашивающего связана с попыткой отобразить шаблоны вне контроллера. - person elquimista; 23.01.2018