Rails 4.1がリリースされました。 移動のいくつかの微妙さ

画像

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の新しいリリースの機能ははるかに広くなっています。 しかし、そこには、すべてがはっきりしているようで、彼らはすでにそれについて書いており、さらに、新しい機能の説明は常に一番上にあります。

ただし、念のため、残りの主要機能のリストを示します。



MySQL Server 4.1のサポートは公式に廃止されました(私のほかの誰かがこの希少性で働くことを余儀なくされた場合)。 実際には、それはまだ機能します。



All Articles