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

Rails5.1のあまり知られていない機能

先週、RailsConf 2017中に、Rails5.1が出荷されました。

発表に従えば、最新のJavaScriptとの統合の改善、暗号化されたシークレット、システムテストなどの大きな機能を確認できます。そして、私の個人的なお気に入りがあります:最後に form_forの奇妙な組み合わせを取り除く およびform_tag 、そしてそれをform_withに置き換えます 。試してみるのが待ちきれません。

しかし、私がRailsを気に入っている理由は、大きな新機能ではありません。少しずつ、絶え間ない改善です。 Railsアプリを書いているときに私を幸せにするのは、生活の質の変化です。そして、Rails5.1はそれらでいっぱいです。

より一貫性のあるタグヘルパー

tagなどのRailsのタグヘルパーを使用しましたか およびcontent_tag

<%= content_tag :p, @user.name, class: "name" %>

Rails 5.1は、新しいタグヘルパー構文を追加します。

tag.divのような呼び出しを使用する またはtag.br 、そしてパラメータの順序について心配するのをやめ、2つの異なる方法をやりくりすることができます:

<%= tag.p @user.name, class: "name" %>
<%= tag.br %>

これらの新しいタグヘルパーはデフォルトでHTML5をサポートし、独自の要素を作成することもできます:

<%= tag.pea @user.name, class: "name" %> 
<!-- turns into <pea class="name">Justin Weiss</pea> -->
単なる違い以上のものを主張する

assert_differenceが大好きです 。 assert_differenceの前 、テストでローカル変数を調整するのに時間がかかりすぎました:

old_score = @user.score
@user.answer_question!(...)
assert_equal old_score + 10, @user.score

assert_differenceを使用 、あなたがやろうとしていることははるかに明確です:

assert_difference "@user.score", 10 do
  @user.answer_question!(...)
end

Rails 5.1では、assert_changes これをさらに一歩進めます。

assert_difference カウントの変更のみをチェックします。 ただし、assert_changes 2つの文字列間、またはnilと他の何かの間の変更など、数値以外の変更をチェックできます。

assert_changes "users(:justin).name", from: "Justin", to: "Bob" do
  @user.update_attributes(name: "Bob")
end

文字列の代わりに、ラムダを指定できます:

assert_changes -> { users(:justin).name }, from: "Justin", to: "Bob" do
  @user.update_attributes(name: "Bob")
end

to: ===と比較できるものなら何でもかまいません。 何かを知っているといいですね 価値についてですが、具体的には何であるかわかりません:

assert_changes -> { users(:justin).updated_at }, to: ActiveSupport::TimeWithZone do
  @user.update_attributes(name: "Bob")
end
すべてを委任する

一部のRailsコードでは、delegateが表示されます 使用される方法。 委任は、継承せずに別のクラスの上に動作を追加する場合に役立ちます:

class Player
  delegate :id, :name, to: :@user

  def initalize(user)
    @user = user
  end
  
  def points
    Game.points_for_user(user.id)
  end
end

ただし、すべてを転送したい場合があります ラッピングしているクラスに。

method_missingを使用して、Rubyでこれを行う方法はいくつかあります。 またはSimpleDelegatorただし、delegateとの一致を高めるため メソッド、delegate_missing_to Rails5.1に追加されました。 それはそれが言うことを正確に行います:

class Player
  delegate_missing_to :@user

  def initalize(user)
    @user = user
  end
  
  def points
    Game.points_for_user(user.id)
  end
end

これで、Playerクラスにないメソッドを呼び出すと、@userが検索されます。 代わりに。

ボーナス:alias_method_chain なくなった!

Ruby 2で私のお気に入りの機能の1つは、Module#prependです。私はそれがとても好きで、それについての投稿を書きました。具体的には、Module#prependが最終的にalias_method_chainに置き換わると私が望んでいたことについて 。

およびRails5.1以降、alias_method_chain 現在、正式に廃止されました–prependに置き換えられました。

Railsの新しいバージョンは常にエキサイティングです。 しかし、Railsにその美しさを与えるのは細部です。 毎日書くコードをより幸せにする小さな変更。

それらの変更をどのように見つけますか?変更ログに飛び込みます。興味深いプルリクエストを見てください。新しい小さな5.1の機能のどれがあなたの生活を少し楽にしてくれるか見てみましょう。

そして、クールなものを見つけたら、それを自分のものにしないでください。ここで共有して、私たち全員が新しいことを学ぶことができるようにしてください!


  1. iPhoneの名前を変更する方法

    ネットワーク上に複数のデバイスがある場合、iPhoneを認識するのが難しいと感じていますか?幸い、iPhoneの名前を変更して、どのリストからでもすばやく簡単に見つけることができます。 Appleは、iPhoneの名前を変更する簡単なオプションを提供しています。次の手順は、その方法を示しています。 なぜiPhoneの名前を変更する必要があるのですか? iPhoneの名前を変更したい理由はさまざまです。 AirDropリストでデバイスを見つけるのに問題があるか、Bluetoothデバイスリストに同じ名前の他のデバイスがあるか、または単に電話に新しい名前を付けたい場合があります。 iPhone

  2. iOS14の8つの最高の新機能

    2020年9月にリリースされたiOS14は、新機能、ホーム画面のデザインの見直し、既存のアプリのアップデートを誇っています。サポートされているiPhoneをお持ちの場合は、すべての最高の新機能とその活用方法を紹介します。 私のiPhoneはiOS14をサポートしていますか? iPhoneでiOS13を実行できる場合は、iOS 14を実行できます。ただし、一部の古い電話では、最新機能の一部(特にカメラのアップデート)を利用できない場合があります。 iOS 14アップデートでサポートされているiPhoneの完全なリストは次のとおりです(iPhone12ラインにはiOS14がインストールされてい