为什么在ApplicationController上定义为private的方法可以在派生类的方法内部调用,但不能在派生类本身内部调用?

Ale*_*hel 3 ruby oop ruby-on-rails ruby-on-rails-3

我在Agile Rails书中做了练习,在application_controller.rb中有一个私有方法,定义如下:

private 
  def current_cart
    Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound 
    cart = Cart.create session[:cart_id] =  cart.id cart 
  end
Run Code Online (Sandbox Code Playgroud)

可以从UserController #index(方法)内部调用此方法,但我不能将其称为:

class UserController < ApplicationController 
  @cart = current_cart
  ...
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Thi*_*ilo 6

您定义的方法ApplicationController是实例方法.因此,可以从派生控制器的另一个实例方法中调用它.这里:

class UserController < ApplicationController 
  @cart = current_cart
Run Code Online (Sandbox Code Playgroud)

您试图在类定义中调用它,而不是在类的实例方法中调用它,因此它正在寻找一个不存在的类方法.

至于能够在派生控制器中调用私有方法,请参阅Rails中的受保护和私有方法.

编辑:来自http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility:

在Ruby中,"私有"可见性类似于Java中的"受保护".Ruby中的私有方法可以从子级访问.你不能在Ruby中拥有真正的私有方法; 你不能完全隐藏一个方法.