Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails 5.1의 덜 알려진 기능

지난 주 RailsConf 2017에서 Rails 5.1이 출시되었습니다.

공지 사항을 따르면 최신 JavaScript와의 더 나은 통합, 암호화된 비밀 및 시스템 테스트와 같은 큰 기능을 볼 수 있습니다. 그리고 제가 개인적으로 가장 좋아하는 것이 있습니다:마침내 form_for의 이상한 콤보 제거하기 및 form_tag , form_with로 대체 . 빨리 시도해보고 싶습니다.

하지만 내가 Rails를 좋아하는 이유는 큰 새로운 기능이 아닙니다. 작지만 지속적인 개선입니다. 내가 Rails 앱을 작성할 때 더 행복해지는 것은 삶의 질 변화입니다. 그리고 Rails 5.1은 그것들로 가득 차 있습니다.

더 일관된 태그 도우미

tag와 같은 Rails의 태그 도우미를 사용해 보셨습니까? 및 content_tag ?

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

Rails 5.1은 새로운 태그 도우미 구문을 추가합니다.

tag.div와 같은 호출 사용 또는 tag.br , 매개변수 순서에 대해 걱정하고 두 가지 방법을 혼동하지 않아도 됩니다.

<%= 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 두 문자열 간의 변경 또는 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 Rails 5.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에서 가장 좋아하는 기능 중 하나는 Module#prepend입니다. 너무 좋아서 포스팅을 하게 되었습니다. 특히 Module#prepend가 결국 alias_method_chain을 대체하기를 바라는 방법에 대해 .

그리고 Rails 5.1부터 alias_method_chain 이제 공식적으로 사라졌습니다 – prepend로 대체되었습니다.

Rails의 새 버전은 항상 흥미진진합니다. 하지만 Rails의 아름다움은 디테일입니다. 매일 작성하는 코드로 당신을 더 행복하게 만드는 작은 변화

그 변화를 어떻게 찾습니까? 변경 로그를 살펴보십시오. 흥미로운 풀 리퀘스트를 살펴보세요. 새롭고 작은 5.1 기능 중 어떤 것이 여러분의 삶을 조금 더 쉽게 만들어줄지 확인하십시오.

멋진 것을 발견하면 혼자 고민하지 마세요. 여기에서 공유하여 모두가 새로운 것을 배울 수 있도록 하세요!