3

私はPythonを使用してきましたが、RubyonRailsの「魔法」がどのように機能するかについて非常に混乱しています。

1.どこにもrequireステートメントはありません

Pythonでは、どこからでも関数にアクセスするには、インポートする必要があります。ベースルビーも同じだと思います。しかし、レールを使用する場合、ページの上部にrequireステートメントがなくても、他のモジュールで定義されている非表示の変数と関数を呼び出すことができます。

たとえば、私はそのようなファイルを持つことができます:

class CartsController < ApplicationController
....
def show
        begin
            @cart = Cart.find(params[:id])
        rescue ActiveRecord::RecordNotFound
            logger.error "Attempt to access invalid cart #{params[:id]}"
            redirect_to store_url, notice: 'Invalid cart'
        end
 end

ロガーリダイレクトなどがすべて定義されていない場合。それは単にApplicationControllerから複雑なツリーを継承するのでしょうか、それとも他のメカニズムを介してそれらの名前空間にアクセスするのでしょうか。

2.存在しないメソッドを使用する

これは有効なRailsコードです

current_item = line_items.find_by_product_id(product_id)

find_by_products_idがどこにも定義されていない場合でも、Railsはその場でメソッドを動的に「作成」します。これがどのように行われるかについての技術的な洞察はありますか?

ご協力いただきありがとうございます!

4

3 に答える 3

9

Railsの「Magic」はとを多用していmethod_missingますconst_missing

定義されていないメソッドを呼び出そうとすると、rubyはへの呼び出しを起動しますmethod_missingActiveRecordこれは、動的ファインダーを実装するようなライブラリによって使用されます。

method_missingの例:

SomeModel.find_by_some_field("some_value")定義されてない。

これはを呼び出しますSomeModel.method_missing(:find_by_some_field, "some_value")

次に、ActiveRecordはこの呼び出しを `SomeModel.where(:some_field =>" some_value ")に変換します

(パフォーマンスの目的で、ActiveRecordはこのメソッドを動的に定義するため、次回find_by_some_fieldは定義されます)

const_missingの例:

SomeModelまだ必要ありません。

Rubyインタプリタはconst_missingパラメータ"SomeModel"で呼び出します

Railsは規則に従い、"SomeModel"というファイルで定義する必要がsome_model.rbありconst_missingますrequire "some_model"

于 2013-01-17T20:54:14.573 に答える
0

Ok。あなたは一つにたくさんの質問をしました。すべてのルビーとレールの魔法を1つの答えで説明するのは難しいでしょうが、いくつかの答えを見つけることができるいくつかの有用なリソースを提供しようと思います。

1)requireステートメントについて。RubyとRailsを初めて使用する場合、Railsアプリケーションがどのように初期化されるかを理解するのは難しいでしょう。ここに、いくつかの有用な情報が得られたチュートリアルがあります。http:
//guides.rubyonrails.org/initialization.html
特定のメソッドに関する詳細情報が必要な場合は、いつでもドキュメントを調べることができます。たとえば、redirect_toメソッド情報:
http ://apidock.com/rails/ActionController/Base/redirect_to

2)「存在しないメソッドの使用」について。これは、メタプログラミングと呼ばれるRuby言語の最も美しい機能の1つです。これも高度なトピックです。ここにいくつかの有用なリソースがあります:
http :
//www.amazon.com/Metaprogramming-Ruby-Program-Like-Pros/dp/1934356476Rubyメタプログラミングオンラインチュートリアル
http://yehudakatz.com/2009/11/15/metaprogramming-in -ruby-its-all-about-the-self /
http://rubylearning.com/blog/2010/11/23/dont-know-metaprogramming-in-ruby/

于 2013-01-17T21:05:45.580 に答える
0

既存の回答のどちらもそれについて言及していないので:はい、のようなものredirect_toはApplicationControllerを介して継承されます。この特定のケースでは、は、ActionController :: Base(ApplicationControllerが継承する)に含まれてredirect_toいるモジュールActionController::Redirectingで定義されています。

于 2013-01-17T21:43:28.783 に答える