4月8日、Ruby on Railsの公式ブログにRails 4.1の公式リリースに関するメッセージが掲載されました。 すべての機能が5200のコミットに収まります。
ハブには既にベータ版のレビューがありました リリースノートとRuby on Railsのアップグレードガイドも読むことができます 。
この記事では、内部にあるものの微妙な点と詳細について説明します。
アクティブレコードの列挙
class Conversation < ActiveRecord::Base enum status: [ :active, :archived ] end # conversation.update! status: 0 conversation.active! conversation.active? # => true conversation.status # => "active" # conversation.update! status: 1 conversation.archived! conversation.archived? # => true conversation.status # => "archived" # conversation.update! status: 1 conversation.status = "archived" # conversation.update! status: nil conversation.status = nil conversation.status.nil? # => true conversation.status # => nil
現在、列挙のためのそのような構文があります。 とてもおいしい、とても便利ですが、いくつかの点を理解することが重要です。
1.列挙はデータベースに整数として保存されますが、名前で取得できます。 (列挙値はデータベース内の整数にマップされますが、名前で照会できます)。
上記の例の移行は次のようになります。
create_table :conversations do |t| t.column :status, :integer end
同時に、SQLクエリでも整数を使用する必要があります。
where('status <> ? OR status <> ?', 0, 1)
where('status <> ? OR status <> ?', STATUS[:resolved], STATUS[:rejected])
この場合、STATUSは列挙を作成するときにマクロによって自動的に追加されるクラス定数であることに注意してください。
2.列挙では 、一部のデータベースに実装されているENUM型は使用されません 。 そのため、データベースにエントリを作成した後、列挙の値の順序を変更することはできません。 これは混乱と対立につながります。 不要な値を削除することはできません。 これを行うには、文字列と数値の対応を明示的に指定する必要があります。
class Bug < ActiveRecord::Base enum status: { new: 0, #removed status with id=1 in_progress: 2, resolved: 3, rejected: 4, reopened: 5 } end
このハッシュは
Bug.statuses
取得できます
3.列挙値の名前には制限があります。
既存のスコープ、関連付け(わかりやすい)、および同じモデル内の既存の列挙(明らかではない)の名前を列挙値と呼ぶことはできません。 例:
class Bug < ActiveRecord::Base enum status: [ :new, :closed ] enum code_review_status: [ :new, :finished ] # end
新しいデフォルトのスコープの動作
現在、default_scopeは、特に明記されていない限り、デフォルトで他のすべてのスコープに影響します。
class User < ActiveRecord::Base default_scope { where state: 'pending' } scope :active, -> { where state: 'active' } scope :inactive, -> { where state: 'inactive' } end
これで
User.active
は
User.where(state: 'pending').where(state: 'active')
と同等になります。 つまり デフォルトでは、すべてのスコープはdefault_scopeへのチェーンに固執します。
これを回避するには、
unscope, except, rewhere
を使用してdefault_scopeからスコープを明示的に「切り離す」必要があります。
class User < ActiveRecord::Base default_scope { where state: 'pending' } scope :active, -> { unscope(where: :state).where(state: 'active') } scope :inactive, -> { rewhere state: 'inactive' } end
高度なCSRF保護。
現在、デフォルトでは、CSRF保護は.js形式の取得リクエストでも有効になっています。
正直な開発者にとって、これには2つの適用される結果があります。
まず、正しいJSコードの形成を確認したすべてのテストが失敗しています。 それに対処するのは簡単です。
代わりに
post :create, format: :js
書く
xhr :post, :create, format: :js
第二に、サードパーティのサイトがjsコードを要求できるようにする必要がある場合、コントローラーにフィルターを追加して明示的に指定する必要があります。
skip_before_filter :verify_authenticity_token, only: [:stats, :visitor]
さて、各アクションで、応答ヘッダーに追加する必要があります。
response.headers['Access-Control-Allow-Origin'] = '*'
または、アスタリスクの代わりに、アクセスを許可するサイトの名前を指定します。
これまでのところ、私が自分でいじくり回さなければならなかったすべてです。 もちろん、Rails 4.1の新しいリリースの機能ははるかに広くなっています。 しかし、そこには、すべてがはっきりしているようで、彼らはすでにそれについて書いており、さらに、新しい機能の説明は常に一番上にあります。
ただし、念のため、残りの主要機能のリストを示します。
- 新しいプロジェクトにデフォルトで追加されるSpringプリローダー
-
config/secrets.yml
とアプリケーションシークレットを保存する機能を追加しました。 - アクションパックのバリエーション-さまざまな種類のデバイス(タブレット、デスクトップ、電話など)に対してさまざまな回答を使用する機能
- アクションメーラープレビュー-MailView gemのRailsへの統合-メールテンプレートを使用した便利な作業。
- メッセージ検証-重要なメッセージの交換と認証。
- モジュール#に関すること-クラス間での責任の便利な共有(正直なところ、この機能が必要な状況はまだ見つかりません)
MySQL Server 4.1のサポートは公式に廃止されました(私のほかの誰かがこの希少性で働くことを余儀なくされた場合)。 実際には、それはまだ機能します。