Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby Gemsはどのように機能しますか?

Railsでの作業を非常に便利にするものの1つは、一般的なプログラミングのニーズ(承認、サイト管理、eコマースなど)に対して、問題の解決策をコード化してパッケージ化したよりも賢い人に名前を付けることです。宝石の形でアップします。

Gemfileにgemを追加して、それらがどのように機能するかを真に理解していなくても、その有用性を最大限に活用することはできますが、すべてがどのように接続されているのか興味がありますか?

ここでは、Ryan BatesのCanCan承認ジェムを詳しく見て、次の質問に答えます(より広く質問された場合、どのジェムにも適用できます):

  1. CanCanのコードはどこに保存されますか?

  2. can?はどこにありますか? メソッドが定義されていますか?

  3. Railsはいつ/どこで/どのようにCanCanのコードをロードしますか?

まず、GemfileにCanCanがあり、bundle installを実行します :

# Gemfile
gem "cancan", "~> 1.6.10"```

$ bundle install

Bundlerを使用すると、特定の宝石がどこにあるかを実際に簡単に確認できます。 bundle showを使用するだけです :

$ bundle show cancan
/Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10

それは質問#1の世話をします。さて、can? 定義されていますか?

$ cd /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
$ grep -r 'def can?' *
lib/cancan/ability.rb: def can?(action, subject, *extra_args)
lib/cancan/controller_additions.rb: def can?(*args)

実際には2つの異なるcan?があるようです。 機能。私たちが興味を持っているのはlib/cancan/ability.rbです。 。

# lib/cancan/ability.rb

def can?(action, subject, *extra_args)
match = relevant_rules_for_match(action, subject).detect do |rule|
rule.matches_conditions?(action, subject, extra_args)
end
match ? match.base_behavior : false
end

ここで実際に起こっていることに関しては、あなたの推測は私のものと同じくらい良いですが、それは重要な部分ではありません。ここでのポイントは、gemの問題にぶつかった場合、gemのコードを掘り下げて、何が起こっているのかを理解しようとする準備ができているということです。

これで、gemのコードが保持されている場所とその中に入る方法がわかったので、Railsはgemについてどのように認識し、いつgemのコードをロードしますか?

これは、Rails初期化ドキュメントの特定のセクションで説明されています。関連する部分は次のとおりです:

標準のRailsアプリケーションには、アプリケーションのすべての依存関係を宣言するGemfileがあります。 config / boot.rbは、ENV['BUNDLE_GEMFILE']をこのファイルの場所に設定します。 Gemfileが存在する場合は、bundler/setupが必要です。

これは、初期化プロセスの早い段階で発生します。正確には、2番目のステップです。プロジェクトが特定の宝石に依存している場合、それをどこで参照できるかを知っているので、これは理にかなっています。コードをどこでも使用できるように、できるだけ早くロードすることをお勧めします。


  1. AASMGemを使用してRubyでステートマシンを作成する方法

    今日は、ステートマシン、それらがどのように機能するか、AASMgemを使用したRubyプロジェクトでそれらを使用する方法について学習します。 今 : 信号機を想像してみてください… 赤、緑、黄色のいずれでもかまいません。 色が変わると、次へ 色は現在に基づいています 1つ。 これは、目の不自由な人がいつ横断できるかを知るための音を出す種類だとしましょう。 今 : あなたはこのためのソフトウェアを書いています。 毎回再生する音と次の色をどのように知るのですか? 次のようなifステートメントを記述できます: if @light.state == green @ligh

  2. Ruby 2.6のMJITとは何ですか?どのように機能しますか?

    Rubyのパフォーマンスはバージョンごとに大幅に向上しており、Ruby開発チームはRubyをさらに高速化するためにあらゆる努力をしています! これらの取り組みの1つは、3×3プロジェクトです。 目標は? Ruby3.0はRuby2.0の3倍高速になります 。 このプロジェクトの一部は、この記事のトピックである新しいMJITコンパイラです。 MJITの説明 MJITは「メソッドベースのジャストインタイムコンパイラ」の略です。 それはどういう意味ですか? RubyはコードをYARV命令にコンパイルします 、これらの命令はRuby仮想マシンによって実行されます。 JITはこれに別のレ