3

我在敏捷 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(method) 内部调用此方法,但我不能这样称呼它:

class UserController < ApplicationController 
  @cart = current_cart
  ...

这是为什么?

4

1 回答 1

6

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

class UserController < ApplicationController 
  @cart = current_cart

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

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

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

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

于 2012-11-27T17:17:40.480 回答