177722693_8aca6c7e82_z

こんにちは。
新卒エンジニアの高松です。普段はgaopinと呼ばれております。
今回が初のテックブログ投稿です!よろしくお願いいたします。

rails5正式リリース

さて、先日、rails5の正式バージョンがリリースされました。
それに伴い、どのような変更があったのか、リリースノートを抄訳にしてみました。
取り急ぎ前半部分をアップいたします。

原文はこちら

主な機能

  • Action Cable

    • WebSocketsとシームレスに統合される新しいrailsのフレームワークです。
    • Action Cableによってリアルタイムの機能を、他のrailsアプリケーションと同じようなrubyのスタイルで記述することができます。
    • クライアントサイドのjavascriptフレームワークと、サーバーサイドのrubyフレームワークの両方を提供するフルスタックのフレームワークです。
    • Active Recordか、もしくは任意のORMで記述された全てのドメインモデルにアクセスすることができます。
  • APIアプリケーション

    • 軽量化されたAPIのみのアプリケーションを作ることができるようになりました。
    • TwitterやGitHubのAPIのような公開されたAPIを作り、提供するのにも便利です。
    • 以下のコマンドでジェネレートすることができます。

    rails new my_api --api

    • APIアプリケーションは主に以下の3つのことをしています。
    • 通常より制限されたミドルウェア群を使用するように設定します。
      • クッキーサポートなどのブラウザーアプリケーションでよく使われるミドルウェアを含まないようになります。
    • ApplicationControllerをActionController::APIを継承して生成します。
      • ブラウザーアプリケーションでよくつかわれるActionControllerのモジュールを含まないようになります
    • 新しいリソースを生成するときに、ジェネレーターがviews、helpers、assetsを生成しないように設定します。
    • APIの基礎を提供し、そうすることで、そのアプリケーションのニーズにあうような機能を引き込むように設定することができます。
  • Active Record attributes API

    • モデルにアトリビュートを、型を指定して定義します。
    • 必要ならば、既存のアトリビュートの型をオーバーライドします。
    • これは、SQLから出入りするデータがどのように変更されるかをコントロールするのに役立ちます。
    • ActiveRecord::Base.whereに渡される値の振る舞いを変更することもできます。それによって、モンキーパッチや実装の詳細に依存せずに、多くのActive Recordをまたいでドメインオブジェクトを使うことができるようになります。
    • これによってできるようになることは以下の様なことです
    • ActiveRecordによって認知されている型はオーバーライドされることができます。
    • defaultも提供することができます。
    • データベースのカラムがアトリビュートの背後にある必要がなくなります。
## db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original default"
end

## app/models/store_listing.rb
class StoreListing  BigDecimal.new(10.1)
StoreListing.new.my_string # "original default"

class StoreListing  { Time.now } #; default value
  attribute :field_without_db_column, :integer, array: true
end

## after
store_listing.price_in_cents #  10
StoreListing.new.my_string #  "new default"
StoreListing.new.my_default_proc #  2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # {field_without_db_column: [1, 2, 3]}
  • カスタムタイプの作成
    • 値の型に定義されているメソッドに対応している限りカスタムタイプを定義することができます。
    • deserializeメソッド、またはcastメソッドは、あなたの型オブジェクトのなかで、コントローラーかデータベースからの生の入力と一緒に呼ばれます。
    • これは金額データなどの変換をカスタムして行うときなどに有効です。
  • Querying
    • ActiveRecord.whereが呼ばれるとき、SQLへ値を変換するために、モデルクラスで定義された型を使い、あなたの型オブジェクトのserializeメソッドを呼びます。
    • これは、SQLクエリを行う際、どう値を変換すれば良いのか特定する能力をオブジェクトに付与します。
  • Dirty Tracking
    • アトリビュートの型は、Dirty Trackingを行う方法を変更する機会を持ちます。
  • Test Runner

    • 新しいテストランナーは、railsから実行されるテストを強化するために導入されました。
    • このテストランナーを使用するには、シンプルに bin/rails testとタイプすれば良いです。

    • このテストランナーは、Rspec、minitest-reporters、maxitestなどにインスパイアされています。

    • 以下の様な特筆するべきアドバンテージがあります。
      • テストの行数を指定して一つのテストを走らせることができます。
      • テストの行数を指定して複数のテストを走らせることができます。
      • 失敗時のメッセージが改良されており、失敗したテストの再実行をより簡単にしています。
      • -fオプションでフェイルファスト実行することができます。これによって、失敗時に即座にテストを止めることができます。
      • -dオプションで、テストの出力をテストがすべて実行されるまで遅らせる事ができます。
      • -bオプションで完全な例外バックトレースを出力することができます。
      • 下記のオプションを指定することでMinitestと統合することができます。
      • -sオプションでseed dataの使用。
      • -nオプションで名前指定で特定のテストの実行。
      • -vでより詳しい出力。
      • テストの出力はカラーです。

Railties

  • 削除された項目
    • debuggerのサポートがなくなりました。byebugを代わりに使いましょう。debuggerはRuby2.2にサポートされていません。
    • 非推奨のtest:allとtest:all:dbタスクが削除されました。
    • 非推奨のRails::Rack::LogTailerが削除されました。
    • 非推奨のRAILS_CONSTANT定数が削除されました。
    • 非推奨の設定項目serve_static_assetsが削除されました。
    • ドキュメンテーションタスクのdoc:app、doc:rails、doc:guidesが削除されました。
    • デフォルトスタックからRack::ContentLengthミドルウェアが削除されました。
  • 非推奨になった項目
    • config.static_cache_controlが非推奨になりました。今後はconfig.public_file_server.headersがより推奨されます。
    • config.serve_static_filesが非推奨になりました。今後はconfig.public_file_server.enebledが推奨されます。
    • rails task名前空間内のタスクが非推奨になりました。今後はapp名前空間が推奨されます。(例:rails:update、rails:templateは、app:update、app:templateに名前が変わります。)
  • 重要な変更点
    • railsテストランナーのbin/rails testが追加されました。
    • 新しく生成されたアプリケショーンとプラグインはMarkdownディレクトリにREADME.mdを持つようになりました。
    • tmp/restart.txtをtouchすることでrailsアプリケーションをリスタートするbin/rails restartタスクが追加されました。
    • railsが呼び出した順に、定義されているinitializerを出力するbin/rails initializersが追加されました。
    • 開発モードでのキャッシュを有効化、無効化するbin/rails dev:cacheが追加されました。
    • 開発環境を自動で更新するbin/updateが追加されました。
    • bin/railsによってrakeタスクが呼び出せるようになりました。
    • 新しいアプリケーションは、LinuxとOS Xのevented file system monitorが有効化されて生成されるようになりました。これは、--skip-listenをジェネレーターに渡すことでスキップすることができます。
    • アプリケーションを生成する際、環境変数のRAILS_LOG_TO_STDOUTによって、プロダクション環境の標準出力にログを出すオプションが設定できるようになりました。
    • 新しいアプリケーションでHSTSがIncludeSudoMainsヘッダーとともに有効化されるようになりました。
    • アプリケーションジェネレーターが、Springに対し、追加されたcommonファイルを見るようにさせるcondfig/spring.rbを書き出すようになりました。
    • 新しいアプリケーションを生成する際、Action Mailerをスキップするようにする。--skip-action-mailerオプションが追加されました。
    • tmp/sessionsディレクトリが削除され、それに関係するrakeタスクがなくなりました。
    • スキャフォールドで生成された_form.html.erbがローカル変数を使うように変更されました。
    • 開発環境で、クラスのオートロードが無効化されました。

Action Pack

  • 削除された項目
    • ActionDispatch::Request::Utils.deep_mungeが削除されました。
    • ActionController::HideActionsが削除されました。
    • respond_to、respond_withプレースホルダーメソッドが削除されました。この機能はresponders gemに抜き出されました。
    • 非推奨になっていたアサーションファイルを削除しました。
    • URLヘルパーの、非推奨になっていたストリングキーの用法を削除しました。
    • 非推奨になっていた*_pathヘルパーのonly_pathオプションを削除しました。
    • 非推奨になっていたNamedRouteCollection#helpersを削除しました。
    • 非推奨になっていた、#を含まない:toオプションによるルートの定義をサポートしなくなりました。
    • 非推奨になっていたActionDispatch::Response#to_aryを削除しました。
    • 非推奨になっていたActionDispatch::Request#deep_mungeを削除しました。
    • 非推奨になっていたActionDispatch::Http::Parameters#symbolized_path_parametersを削除しました。
    • 非推奨になっていた、コントローラーテストのuse_routeオプションを削除しました。
    • assigns、assert_templateメソッドを削除しました。このメソッドはrails-controller-testing gemに引き抜かれました。
  • 非推奨になった項目
    • すべての*_filterコールバックが非推奨になりました。今後は*_actionコールバックが推奨されます。
    • *_via_redirect統合テストメソッドが非推奨になりました。今後同様の振る舞いを実装するには、follow_redirect!をリクエストコールの後に明示的に使いましょう。
    • AbstractController#skip_action_callbackが非推奨になりました。今後は、個別のskip_callbackメソッドの仕様が推奨されます。
    • renderメソッドの:nothingオプションが非推奨になりました。
    • headメソッドの第一引数として、ハッシュとデフォルトステータスコードを渡すことは非推奨となりました。
    • 定数によってmime型にアクセスすることは非推奨となりました。(例: Mime::HTML)今後はシンボルとサブスクリプトオペレータの使用が推奨されます。(例: Mime[:html])
    • redirect_to :backが非推奨になりました。今後はfallback_location引数を必須で受け取るredirect_backが推奨されます。これによってRedirectBackErrorの可能性を排除することができます。
    • ActionDispatch::IntegrationTest、ActionController::TestCaseでのpositional argumentsが非推奨になりました。今後はkeyword argumentsの使用が推奨されます。
    • パスパラメーターの:controllerと:actionが非推奨となりました。
    • コントローラーインスタンスのenvメソッドが非推奨となりました。
    • ActionDispatch::ParamParserが非推奨となり、ミドルウェアスタックから削除されました。パラメーターパーサーを設定するときは、ActionDispatch::Request.parameter_parsers=の使用が推奨されます。
  • 重要な変更
    • コントローラーアクションの外で任意のテンプレートをレンダーできるよう、ActionController::Rendererが追加されました。
    • ActionController::TestCaseとActionDispatch::Integration HTTPリクエストメソッドをkeyword argumentsの文法へ移行。
    • レスポンスを失効しないキャッシュとして保持できるようhttp_cache_foreverをアクションコントローラーへ追加。
    • リクエストバリアントへのより簡単なアクセスを提供。
    • 対応するテンプレートの無いアクションに対し、エラーを吐く代わりにhead :no_contentをレンダーするように変更。
    • コントローラーのデフォルトのフォームビルダーをオーバーライドできるように変更。
    • APIオンリーアプリケーションをサポート。この種のアプリケーションのために、ActionController::Baseの代わりとなるActionController::APIを追加。
    • ActionController::ParametersをHashWithIndifferentAccessを継承しないように変更。
    • config.force_sslとconfig.ssl_optionsを、より安全に試せ、より簡単に無効化できるようにすることで導入しやすいように変更。
    • ActionDispatch::Staticに任意のヘッダーを返せるように変更。
    • protect_from_forgeruのデフォルトをfalseに変更。
    • ActionController::TestCaseは、rails5.1でgemに移行する。ActionDispatch::IntegrationTestを代わりに使うことが推奨される。
    • strong Etagの代わりにweakのみを生成する。
    • 明示的なレンダーコールと、対応するテンプレートのないコントローラーアクションは、エラーを吐かずにhead :no_contentをレンダーするように。
    • フォームごとのCSRFトークンを使用するオプションを追加。
    • 統合テストのレスポンスのパースとエンコードのリクエストを追加。
    • コントローラーアクションが明示的なレスポンスを示さない場合のデフォルトのレンダリングのポリシーを更新。
    • コントローラーレベルでビューのコンテクストへアクセスするために、ActionController#helpersを追加。
    • セッションに保存される前に、破棄されたフラッシュメッセージは削除されるように。
    • fresh_whenとstale?へレコードのコレクションを渡せるように変更。
    • ActionController::LiveはActiveSupport::Concernの一つに変更。これは、他のモジュールがActiveSupport::Concernで拡張されないかぎり、ActionController::Liveをインクルードすることが出来ないので、プロダクション環境で影響を及ぼさないことを意味する。いくらかの人々は、ミドルウェアはスレッドから投げられた:Wardenをキャッチできないために、Warden/Devise認証の失敗をハンドリングするコードをインクルードするために他のモジュールを使っているかもしれないが、これはActionController::Liveを使用しているケースである。

Action view

  • 削除された項目
    • 非推奨になっていたAbstractController::Base::parent_prefixesが削除されました。
    • ActionView::Helpers::RecordTagHelperが削除されました。これはrecord_tag_helper gemに抜き出されました。
    • I18nにサポートされなくなったため、translateヘルパーのための:rescue_formatオプションが削除されました。
  • 重要な変更
    • デフォルトのテンプレートハンドラーがERBからRawに変更されました。
    • コレクションレンダリングがキャッシュできるようになり、複数のパーシャルを一度にフェッチできるようになりました。
    • 明示的な依存に対するワイルドカードマッチングが追加されました。
    • disable_withをサブミットタグに対するデフォルトの振る舞いに変更しました。これによって複数サブミットが無効化されます。
    • パーシャルテンプレートの名前が、正しいrubyの識別子である必要がなくなりました。
    • datetime_tagヘルパーがdatetime-localタイプのinputタグを生成するようになりました。

注目の変更点

今回のアップデートにより、rakeタスクをrailsコマンドで実行できるようになりました。
慣れるまでは何がrailsタスクで何がrakeタスクだったか分かりにくい部分があったので、rails一本でできるようになったのは大きいと思います。
また、APIアプリケーションを指定して生成できるようになった点も、従来はgemで対応していたことが本家でサポートされたということで、便利になった点といえます。

近日後半の抄訳も上げる予定ですので、しばしの間お待ち下さい!