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

时间:2012-11-27 16:49:23

标签: ruby-on-rails ruby ruby-on-rails-3 oop

我在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

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

class UserController < ApplicationController 
  @cart = current_cart
  ...

为什么会这样?

1 个答案:

答案 0 :(得分:6)

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

class UserController < ApplicationController 
  @cart = current_cart

你试图在类定义中调用它,而不是在类的实例方法中调用它,所以它正在寻找一个不存在的类方法。

至于能够在派生控制器中调用私有方法,请参阅例如Protected and private methods in Rails

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

  

在Ruby中,“私有”可见性类似于Java中的“protected”。 Ruby中的私有方法可以从子级访问。你不能在Ruby中拥有真正的私有方法;你无法完全隐藏一种方法。