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

Rails 7의 새로운 기능

Rails 7이 바로 모퉁이에 있습니다. 확정된 릴리스 날짜는 없지만 크리스마스 전에 사용할 수 있을 것으로 예상되므로 얼마 남지 않았습니다. 이 게시물 게시 시점의 최신 버전은 7.0.0.rc1입니다. , 첫 번째 릴리스 후보입니다.Basecamp, HEY, Github 및 Shopify는 모두 프로덕션 단계에서 Rails 7 알파를 실행하고 있으므로 릴리스 후보도 꽤 안정적일 것으로 예상할 수 있습니다.

이 게시물에서는 Rails 7이 가져올 몇 가지 새로운 기능과 변경 사항을 살펴보겠습니다.

노드 및 웹팩이 필요하지 않음

예, 당신은 그것을 올바르게 읽었습니다! Rails 7의 JavaScript에는 더 이상 NodeJS 또는 Webpack이 필요하지 않습니다. 그리고 npm 패키지를 계속 사용할 수 있습니다.

Babel을 사용하여 ES6을 변환하고 Webpack과 번들링하려면 많은 설정이 필요합니다. Rails는 Webpacker를 통해 꽤 잘 지원했지만 gem, 이것은 많은 짐을 가져왔고, 특히 업그레이드 가능성을 유지하면서 이해하고 변경하기가 어려웠습니다.

이제 rails new로 생성된 새 앱의 기본값 importmaps-rails를 통해 가져오기 맵을 사용하는 것입니다. gem.package.json을 작성하는 대신 npm으로 종속성 설치 또는 yarn , ./bin/importmap을 사용합니다. 종속성을 고정(또는 고정 해제 또는 업데이트)하는 CLI.

예를 들어 date-fns를 설치하려면 :

$ ./bin/importmap pin date-fns

이렇게 하면 config/importmap.rb에 줄이 추가됩니다. 좋아요:

pin "date-fns", to: "https://ga.jspm.io/npm:[email protected]/esm/index.js"

JavaScript 코드에서 다음과 같이 모든 것을 계속 사용할 수 있습니다.

import { formatDistance, subDays } from "date-fns";
 
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true });
//=> "3 days ago"

이 설정에서 염두에 두어야 할 한 가지는 작성한 내용과 브라우저가 얻는 내용 사이에 변환이 없다는 것입니다. 이제 중요한 모든 브라우저가 기본적으로 ES6을 지원하므로 대부분의 경우 문제가 없습니다.

그러나 이것은 사용하기 전에 JS로 변환해야 하므로 TypeScript 또는 JSX를 사용할 수 없다는 의미이기도 합니다.

따라서 JSX와 함께 React를 사용하려면 여전히 다른 설정(webpack/rollup/esbuild 사용)으로 폴백해야 합니다.

Rails 7이 이 작업을 수행할 수 있습니다. 선택한 전략과 함께 하나의 명령만 있으면 됩니다.

$ ./bin/rails javascript:install:[esbuild|rollup|webpack]

Turbolinks 및 UJS가 Turbo 및 Stimulus로 대체됨

Rails 7로 생성된 애플리케이션은 기본적으로 Turbolinks 및 UJS 대신 Turbo 및 Stimulus(Hotwire에서)를 가져옵니다. Hotwire는 유선을 통해 HTML을 전송하여 DOM에 대한 빠른 업데이트를 제공하는 새로운 접근 방식입니다.

데이터베이스 계층에서의 암호화

Rails 7에서는 encrypts를 사용하여 특정 데이터베이스 필드를 암호화된 것으로 표시할 수 있습니다. ActiveRecord::Base의 메소드 . 즉, 초기 설정 후에 다음과 같은 코드를 작성할 수 있습니다.

class Message < ApplicationRecord
  encrypts :text
end

다른 속성과 마찬가지로 암호화된 속성을 계속 사용할 수 있습니다. Rails 7은 데이터베이스와 애플리케이션 간에 자동으로 암호화 및 복호화합니다.

그러나 여기에는 약간의 문제가 있습니다. deterministic: true를 전달하지 않는 한 해당 필드로 데이터베이스를 쿼리할 수 없습니다. encrypts 옵션 method.결정적 모드는 기본 비결정적 모드보다 덜 안전하므로 반드시 쿼리해야 하는 속성에만 사용하십시오.

비동기 쿼리

이제 load_async가 있습니다. 백그라운드에서 결과를 가져오기 위해 데이터를 쿼리할 때 사용할 수 있는 메서드입니다. 이는 컨트롤러 작업에서 관련 없는 여러 쿼리를 로드해야 할 때 특히 중요합니다. 다음을 실행할 수 있습니다.

def PostsController
  def index
    @posts = Post.load_async
    @categories = Category.load_async
  end
end

이렇게 하면 백그라운드에서 동시에 두 쿼리가 실행됩니다. 따라서 각 쿼리가 200ms가 걸린다면 데이터를 가져오는 데 소요된 총 시간은 직렬로 가져오는 경우 400ms가 아니라 ~200ms입니다.

Rails 7용 Zeitwerk 모드

이것은 여전히 ​​클래식 로더를 실행하는 이전 응용 프로그램에 대한 주요 변경 사항입니다. 모든 Rails 7 애플리케이션은 Zeitwerk 모드를 사용해야 하지만 전환은 매우 쉽습니다. 전체 Zeitwerk 업그레이드 가이드를 확인하십시오.

기타 Rails 7 업데이트

작업 무제한 재시도

ActiveJob은 이제 :unlimited 전달을 허용합니다. attempts retry_on의 매개변수 . Rails는 최대 시도 횟수 없이 작업을 계속 시도합니다.

class MyJob < ActiveJob::Base
  retry_on(AlwaysRetryException, attempts: :unlimited)
 
  def perform
    raise "KABOOM"
  end
end

명명된 변형

이제 ActiveStorage에서 변형 이름을 지정할 수 있습니다. 액세스할 때마다 크기를 지정하는 대신

class User < ApplicationRecord
  has_one_attached :avatar do |attachable|
    attachable.variant :thumb, resize: "100x100"
  end
end
 
#Call avatar.variant(:thumb) to get a thumb variant of an avatar:
<%= image_tag user.avatar.variant(:thumb) %>

HTML 속성에 대한 해시

새로운 tag.attributes가 있습니다. 해시를 HTML 속성으로 변환하는 뷰에서 사용하는 방법:

<input <%= tag.attributes(type: :text, aria: { label: "Search" }) %>>

생산할 것입니다

<input type="text" aria-label="Search" />

루비 debug

디버깅을 위한 새 기본값이 byebug에서 변경되었습니다. debug로 보석.

byebug를 호출하는 대신 , 이제 debugger를 호출해야 합니다. 코드에서 디버깅 세션을 입력합니다.

sole로 단일 레코드 주장

레코드를 쿼리할 때 이제 sole을 호출할 수 있습니다. 또는 find_sole_by (first 대신 또는 find_by ) 쿼리가 단일 레코드와만 일치해야 한다고 주장하려는 경우.

Product.where(["price = %?", price]).sole
# => ActiveRecord::RecordNotFound      (if no Product with given price)
# => #<Product ...>                    (if one Product with given price)
# => ActiveRecord::SoleRecordExceeded  (if more than one Product with given price)
 
user.api_keys.find_sole_by(key: key)
# as above

협회 유무 확인

이제 where.associated(:association)를 사용할 수 있습니다. id의 존재 여부를 확인하고 가입하는 대신 레코드에 연결이 있는지 확인합니다.

# Before:
account.users.joins(:contact).where.not(contact_id: nil)
 
# After:
account.users.where.associated(:contact)

컨트롤러 작업에서 생성된 파일 스트리밍

이제 send_stream을(를) 사용할 수 있습니다. 즉석에서 생성되는 파일 스트리밍을 시작하는 컨트롤러 작업 내부.

send_stream(filename: "subscribers.csv") do |stream|
  stream.write "email_address,updated_at\n"
 
  @subscribers.find_each do |subscriber|
    stream.write "#{subscriber.email_address},#{subscriber.updated_at}\n"
  end
end

이것은 사용자에게 즉각적인(부분적) 응답을 제공하여 사용자가 무슨 일이 일어나고 있는지 알 수 있도록 하며 Heroku에 배포하는 경우 추가적인 이점이 있습니다.

파일이 즉시 스트리밍을 시작하기 때문에 Heroku는 연결을 종료하지 않습니다. 즉, 30초 이상 걸리는 일회성 파일을 생성하기 위해 백그라운드 작업에 의존할 필요가 없습니다.

Rails 7로 업그레이드

이전 버전의 Rails와 마찬가지로 업그레이드가 간단합니다. 아직 공식 업그레이드 가이드는 없지만 단계는 동일하게 유지됩니다.

  1. Gemfile(7.0.0.rc1)에서 Rails 버전 번호를 변경합니다. 발행일 기준) bundle update 실행 .
  2. bundle exec rails app:update 실행 . 대화형 CLI를 따르고 필요에 따라 파일을 추가/교체/수정합니다.
  3. 테스트를 실행하고 모든 것이 예상대로 작동하는지 확인합니다.

마무리

Rails 7 릴리스 노트에서 버그 수정, 기능 및 변경 사항의 전체 목록을 볼 수 있습니다. 현재로서는 포괄적이지 않지만 곧 업데이트될 것으로 예상됩니다.

여전히 Rails 6 이하를 실행하고 있다면 Rails 7의 최종 릴리스에서 Rails 6.1이 "보안 문제만" 모드로 전환되고 더 이상 버그 수정을 받지 않습니다. 이것은 또한 Rails 5.2의 EOL을 표시합니다. 더 이상 수정 사항을 받지 않기 때문입니다.

즐거운 코딩하세요!

추신 Ruby Magic 게시물이 언론에 공개되는 즉시 읽고 싶다면 Ruby Magic 뉴스레터를 구독하고 게시물을 놓치지 마세요!