지난 주 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 기능 중 어떤 것이 여러분의 삶을 조금 더 쉽게 만들어줄지 확인하십시오.
멋진 것을 발견하면 혼자 고민하지 마세요. 여기에서 공유하여 모두가 새로운 것을 배울 수 있도록 하세요!