Rails 5 в applicationHelper помощник виден, другой нет - PullRequest
0 голосов
/ 30 октября 2018

Я учу рельсы. Я создаю простое тестовое приложение с простой схемой аутентификации. Я использую поле user.role для группировки пользователей. В моем приложении помощник у меня есть:

module ApplicationHelper
def current_user
  if session[:user_id]
    @current_user ||= User.find(session[:user_id])
  else
    @current_user = nil
  end
end

def user_identity
  current_user.role if current_user
end
end

Теперь в моем приложении я могу использовать current_user во всех контроллерах, как и ожидалось, но вместо этого user_identity не отображается.

почему

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вспомогательные модули смешиваются в контексте представления (неявное self в ваших представлениях), а не контроллеры.

Так что вы можете вызвать его с контроллера с помощью:

class ThingsController < ApplicationController
  # ...
  def index
    view_context.user_identity
  end
end

Или вы можете включить помощника методом helper:

class ThingsController < ApplicationController
  helper :my_helper
  def index
    user_identity
  end
end

Но если вы пишете набор методов аутентификации, я бы в первую очередь не использовал помощника. Предполагается, что помощники являются помощниками для представления.

Вместо этого я бы создал концерн (также модуль) и включил его в ApplicationController:

# app/controllers/concerns/authenticable.rb
module Authenticable
  extend ActiveSupport::Concern
  def current_user
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : nil
  end 

  def user_identity
    current_user.try(:role)
  end
end

class ApplicationController < ActionController::Base
  include Authenticable
end

Поскольку представление может обращаться к любому из методов контроллеров, это добавляет методы к обоим контекстам.

0 голосов
/ 30 октября 2018

application_helper используется в основном для доступа к методам в представлениях - я не верю, что он доступен в контроллере.

Причина, по которой ваш метод 'current_user' работает, в том, что я предполагаю, что вы используете Devise - когда вы вызываете 'current_user', он использует метод Engine, а не ваш собственный.

Чтобы решить эту проблему, запишите новый модуль:

module MyHelper
  def current_user
    if session[:user_id]
      @current_user ||= User.find(session[:user_id])
    else
      @current_user = nil
    end
  end

  def user_identity
    current_user.role if current_user
  end
end

А в используемом вами контроллере:

class MyController < ApplicationController
  include MyHelper

  bla bla bla...
end

Любые методы, определенные в MyHelper, теперь будут доступны в MyController, так как мы включили модуль в контроллер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...