Я вызываю метод на контроллере A, который отображает шаблон jbuilder (файл с именем signed_in.json.jbuilder). Внутри шаблона я хочу вызвать метод friendsCount, который находится в контроллере B. Я получаю сообщение об ошибке, когда пытаюсь получить доступ к методу контроллера B внутри шаблона. Ошибка:Как получить доступ к методу контроллера из шаблона jbuilder
NameError - undefined local variable or method `friendsCount' for #<#<Class:0x007f90a09994f8>:0x007f90a0998788>:
app/views/api/sessions/signed_in.json.jbuilder
Я думал, что добавление helper_method: friendsCount
к контроллеру B должен решить именно тип вопроса я хочу, чтобы решить: сделать метод контроллера доступен в представлениях. На самом деле, когда я пытаюсь получить доступ к методу из моего ApplicationController в моем шаблоне jbuilder (контроллер C ниже), у меня нет проблем. Вот мой код:
CONTROLLER A:
class Api::SessionsController < ApplicationController
def create
@user = User.find_by_credentials(session_params[:username], session_params[:password])
if @user.nil?
render json: ["couldn't find user"], status: 404
else
sign_in!(@user)
render :signed_in
end
end
private
def session_params
params.require(:session).permit(:username, :password)
end
end
JBuilder ШАБЛОН: signed_in.json.jbuilder
json.friendsSorted sortFriends
json.friends friendsCount
CONTROLLER B
class Api::FeedsourcesController < ApplicationController
helper_method :friendsCount
def friendsCount
friendsCountHash = {}
# ... populate friendsCountHash
render json: friendsCountHash
end
CONTROLLER C
class ApplicationController < ActionController::Base
helper_method :sortFriends
def sortFriends
#...
return sortedFriendsArray
end
end
Я не хочу иметь метод friendsCount в папке помощников, потому что мне также нужно иметь прямой маршрут контроллера для этого метода для других целей.
Хорошо, поэтому я просто поставлю его в свой контроллер приложений. Есть ли причина, по которой нет доступа к другому контроллеру? Я бы предположил, что это потому, что это потенциально опасно, но почему это было бы опаснее, чем вызов другого метода в вызывающем контроллере или его суперклассе? – evianpring
Если все в порядке: любое представление отображается в контексте экземпляра контроллера (на самом деле это немного сложно, поэтому вам следует объявить вспомогательные методы) – MikDiet