如何从jbuilder模板访问控制器方法

时间:2016-02-11 14:39:52

标签: ruby-on-rails ruby

我在控制器A上调用一个方法来呈现一个jbuilder模板(一个名为signed_in.json.jbuilder的文件)。在模板中我想调用一个方法,friendsCount,它在控制器B中。当我尝试访问模板内的控制器B方法时,我收到错误。错误是:

NameError - undefined local variable or method `friendsCount' for #<#<Class:0x007f90a09994f8>:0x007f90a0998788>:
  app/views/api/sessions/signed_in.json.jbuilder

我认为向控制器B添加helper_method: friendsCount应该可以解决我想要解决的问题类型:在视图中使控制器方法可用。 实际上,当我尝试在我的jbuilder模板(下面的控制器C)中从我的ApplicationsController访问一个方法时,我没有问题。 这是我的代码:

控制器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

控制器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

我不想在helpers文件夹中使用friendsCount方法,因为我还需要能够将此方法的直接控制器路由用于其他目的。

1 个答案:

答案 0 :(得分:2)

您需要在调用控制器或其超类中使用辅助方法。

在您的情况下,它是SessionsControllerApplicationController

FeedsourcesController不是SessionsController的超类,因此视图渲染器不知道其中的任何方法。