2016-02-11 3 views
0

Я вызываю метод на контроллере 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 в папке помощников, потому что мне также нужно иметь прямой маршрут контроллера для этого метода для других целей.

ответ

1

Вам нужны вспомогательные методы в вызывающем контроллере или его суперклассе.

В вашем случае это SessionsController и ApplicationController.

FeedsourcesController не является суперклассом для SessionsController, поэтому средство визуализации представления не знает о каких-либо методах в нем.

+0

Хорошо, поэтому я просто поставлю его в свой контроллер приложений. Есть ли причина, по которой нет доступа к другому контроллеру? Я бы предположил, что это потому, что это потенциально опасно, но почему это было бы опаснее, чем вызов другого метода в вызывающем контроллере или его суперклассе? – evianpring

+0

Если все в порядке: любое представление отображается в контексте экземпляра контроллера (на самом деле это немного сложно, поэтому вам следует объявить вспомогательные методы) – MikDiet

Смежные вопросы