0

** Rails :3.2.1 を使用、Ruby: ruby​​ 1.9.3p0 (2011-10-30 リビジョン 33570) [i686-linux] **

私のモジュールには、1 つのプライベート インスタンス メソッド (get_tables_of_random_words) と 1 つのモジュール関数 (get_random_word) があります。

Rails コントローラーからモジュール関数を呼び出していますが、問題なく動作します。ただし、モジュールのプライベートインスタンスメソッドを呼び出すと、問題なく呼び出されます。

このような動作の背後にある理由と、私が望む機能を実現する方法を誰か説明してください.モジュールを含むクラスからモジュールのプライベートインスタンスメソッドを呼び出したくありません.私のプライベートインスタンスメソッドは、必要なユーティリティメソッドです.モジュールの内部からのみ動作します。

Util::RandomWordsUtil

    module Util
        module RandomWordsUtil
            def get_tables_of_random_words
                # Implementation here
            end

            private :get_tables_of_random_words 

            module_function

            def get_random_word
                # invoke get_tables_of_random_words
            end

        end

    end

GamesController (Scaffold 生成コントローラー - カスタマイズ)

        class GamesController < ApplicationController

          include Util::RandomWordsUtil

          # GET /games
          # GET /games.json
          def index
          end

          def play
            @game = Game.find(params[:id])

            @random_word = get_random_word # This is a module_function
            @random_table = get_tables_of_random_words # This I have marked as private in my module still it gets invoked!

            # Render action show
            render "show"
          end

          # GET /games/1
          # GET /games/1.json
          def show
          end

          # GET /games/new
          # GET /games/new.json
          def new
          end

          # GET /games/1/edit
          def edit
          end

          # POST /games
          # POST /games.json
          def create
          end

          # PUT /games/1
          # PUT /games/1.json
          def update
          end

          # DELETE /games/1
          # DELETE /games/1.json
          def destroy
          end
        end

以下は、私が試したアプローチですが、期待どおりに機能しませんでした。参考:Rubyのプライベートモジュールメソッド

Util::RandomWordsUtil (試みたアプローチ-1) # get_tables_of_random_words could not be found エラーは get_random_word メソッドからプロンプト表示されます

    module Util
        module RandomWordsUtil
            def self.included(base)
                class << base
                    def get_tables_of_random_words
                        # Implementation here
                    end

                    private :get_tables_of_random_words 
                end
            end

            module_function

            def get_random_word
                # invoke get_tables_of_random_words
            end

        end

    end

Util::RandomWordsUtil (試したアプローチ-2) # 未定義のローカル変数またはメソッド 'get_random_word' を示すエラーがコントローラーからプロンプト表示されます

    module Util
        module RandomWordsUtil
            def self.included(base)
                class << base
                    def get_random_word
                        # invoke get_tables_of_random_words 
                    end

                    private 
                    def get_tables_of_random_words
                        # Implementation here
                    end

                end
            end
        end
    end

ありがとう、
ジグネッシュ

4

1 に答える 1

0

モジュールを「インクルード」すると、その中のすべてのメソッドがそれを含むクラスのメソッドになるように、ミックスインになっていると思います。代わりに「必須」にしてみましたか?

于 2012-03-02T00:05:07.983 に答える