3

私はアジャイルレールの本で演習を行っていましたが、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 に答える