レールは宝石をどのように処理しますか?
数週間前、RubyGemsがRubyのロードパスを管理する方法について書きました。ただし、RailsはRubyGemsを直接使用せず、Bundlerを使用してgemを管理します。
Bundlerがどのように機能するかわからない場合、宝石がRailsに引き込まれる方法は少しに思えるかもしれません。 魔法の。 Gemfile
に行を追加するにはどうすればよいですか アプリにコードを入れますか? Bundler、Rails、RubyGemsがどのように連携して、依存関係の処理を容易にしますか?
なぜBundlerなのか?
Bundlerは厳密な宝石マネージャーだと思います。つまり、 Bundlerは、必要なgemの適切なバージョンをインストールするのに役立ち、アプリをのみに強制します。 それらのバージョンを使用してください。
これは本当に役に立ちます。理由を理解するには、Bundlerの前に世界に戻らなければなりません。
Bundlerが登場する前は、ある種のセットアップスクリプトを使用して、適切なバージョンのgemをインストールするのは非常に簡単でした。
gem install rails -v 4.1.0
gem install rake -v 10.3.2
...
(つまり、Rails4.1の依存関係がRake10.3.2の依存関係と競合しない限り!)
しかし、それぞれが異なるバージョンのgemに依存する、いくつかの異なるRailsアプリで作業している場合はどうなりますか? 本当に注意しないと、ひどい宝石アクティベーションエラーが発生します:
Gem::Exception: can't activate hpricot (= 0.6.161, runtime),
already activated hpricot-0.8.3
うーん。そのメッセージはまだ私に悪夢を与えます。これは通常、gemのインストールとアンインストールを1日行うことを意味するため、だけ取得できます。 そのマシンの適切なバージョン。そして、必要なのは偶発的なgem install rake
注意深い計画をすべて完全に台無しにする。
rvm gemsetsは、しばらくの間この問題を解決しました。ただし、セットアップには時間がかかり、誤って間違ったgemsetにインストールした場合は、同じ問題に戻ります。 Bundlerを使用すると、依存関係について考える必要はほとんどありません。通常、アプリは正常に機能します。 また、Bundlerはgemsetよりもはるかに少ないセットアップで済みます。
したがって、Bundlerは2つの重要なことを行います。必要なすべてのgemをインストールし、RubyGemsをロックダウンするため、これらのgemはのみ そのRailsアプリ内で必要なもの。
RailsはBundlerをどのように使用しますか?
基本的に、Bundlerはgemをインストールして分離します。しかし、それだけではありません。 Gemfile
のgemからのコードはどのようになりますか Railsアプリにしますか?
bin/rails
を見ると :
#!/usr/bin/env ruby
begin
load File.expand_path("../spring", __FILE__)
rescue LoadError
end
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'
../config/boot
を要求すると、Railsが読み込まれることがわかります。 。そのファイルを見てみましょう:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' # Set up gems listed in the Gemfile.
ねえ、それはバンドラーです! (また、別のGemfile
を選択できることを学びました 環境変数BUNDLE_GEMFILE
を設定して使用します 。とてもかっこいいです。)
bundler/setup
いくつかのことを行います:
-
$LOAD_PATH
からgemへのすべてのパスを削除します (これにより、RubyGemsが行ったロードパスの作業が逆になります。) - 次に、
Gemfile.lock
内のgemのみのロードパスを追加します$LOAD_PATH
に戻る 。
現在、require
できる唯一の宝石 からのファイルは、Gemfile
にあるファイルです。 。
したがって、必要なすべての宝石はロードパス上にあります。ただし、RubyGemsを単独で使用する場合でも、require
する必要があります。 必要なファイル。 BundlerでRailsを使用するときに、宝石を要求する必要がないのはなぜですか?
config/application.rb
をざっと見てください 、Railsの起動後に実行されます:
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
再びバンドラーです! Bundler.require
渡すすべてのグループのすべての宝石が必要です。 (「グループ」とは、Gemfileで指定するグループを意味します。)
Rails.groups
に含まれるグループ 、でも?
# Returns all rails groups for loading based on:
#
# * The Rails environment;
# * The environment variable RAILS_GROUPS;
# * The optional envs given as argument and the hash with group dependencies;
#
# groups assets: [:development, :test]
#
# # Returns
# # => [:default, :development, :assets] for Rails.env == "development"
# # => [:default, :production] for Rails.env == "production"
def groups(*groups)
hash = groups.extract_options!
env = Rails.env
groups.unshift(:default, env)
groups.concat ENV["RAILS_GROUPS"].to_s.split(",")
groups.concat hash.map { |k, v| k if v.map(&:to_s).include?(env) }
groups.compact!
groups.uniq!
groups
end
まあ、それはそれを説明しています。 Rails.groups
[:default, :development]
になります Railsを開発モードで実行している場合、[:default, :production]
本番モードなどで。
したがって、BundlerはGemfile
を調べます これらの各グループに属するgemの場合は、require
を呼び出します。 それが見つけた宝石のそれぞれに。 宝石をお持ちの場合nokogiri
、require "nokogiri"
と呼ばれます あなたのために。 そのため、通常、gemはRailsで機能し、追加のコードは必要ありません。
使用しているツールをよく理解していれば、それらを使用する方が簡単です。したがって、常に何かを使用していることに気付いた場合は、もう少し掘り下げるのに数分かかる価値があります。
RubyとRailsで作業している場合は、毎日宝石を使用します。時間をかけてよく学んでください!
-
RailsでFlashメッセージを使用する方法
フラッシュメッセージとは何ですか? フラッシュメッセージは、Railsアプリケーションのユーザーと情報を伝達する方法であり、ユーザーはアクションの結果として何が起こるかを知ることができます。 メッセージの例 : 「パスワードが正しく変更されました」(確認) 「ユーザーが見つかりません」(エラー) これらのフラッシュメッセージをコントローラーに設定してから、ビューにレンダリングします。その後、ユーザーはそれに応じて行動できます。 これがどのように機能するかを正確に学びましょう! フラッシュメッセージの使用方法 flashを使用して、これらの通知メッセージを操作できます ヘルパーメソ
-
RailsアプリケーションでOmniAuth-Twitterを使用する方法
このチュートリアルでは、アプリケーションのユーザーがTwitterアカウントを使用してログインできるようにする方法を学習します。これを行うには、OAuthなどのツールを使用すると簡単になります。 OmniAuthのTwitter戦略を含むOmniAuth-Twitterを利用します。 飛び込みましょう! はじめに Railsアプリケーションを生成することから始めます。ターミナルから、コマンドを実行して実行します。 rails new Tuts-Social -T Gemfileを開き、ブートストラップgemを追加します。 #Gemfile...gem bootstra