我在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
...
为什么会这样?
答案 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中拥有真正的私有方法;你无法完全隐藏一种方法。