【问题标题】:How to access a controller method from a jbuilder template如何从 jbuilder 模板访问控制器方法
【发布时间】:2016-02-11 14:39:52
【问题描述】:

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

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

我认为将helper_method: friendsCount 添加到控制器 B 应该可以解决我想要解决的问题类型:使控制器方法在视图中可用。 实际上,当我尝试从我的 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

控制器C

class ApplicationController < ActionController::Base
  helper_method :sortFriends

  def sortFriends
    #...
    return sortedFriendsArray
  end
end

我不想在 helpers 文件夹中包含 friendsCount 方法,因为我还需要能够有一个直接的控制器路由到该方法以用于其他目的。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

    在您的情况下,它是 SessionsControllerApplicationController

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

    【讨论】:

    • 好的,我将把它放在我的应用程序控制器中。是否有任何理由无法访问另一个控制器?我想这是因为它在某种程度上具有潜在的危险,但为什么它比在调用控制器或它的超类中调用另一个方法更危险?
    • 如果保持简单——任何视图都在控制器实例的上下文中呈现(实际上这有点复杂,这就是为什么你应该声明辅助方法)
    猜你喜欢
    • 2015-10-16
    • 2011-10-22
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2017-02-06
    相关资源
    最近更新 更多