Turbo-Rails 앱의 HTTP 리디렉션

6694 단어 turbohotwirerailshttp
이 게시물은 The Rails and Hotwire Codex에서 추출 및 수정되었습니다.

Rails에서 컨트롤러 작업의 일반적인 리디렉션은 다음과 같습니다.

def create
  # ...

  redirect_to root_path
end


그러면 HTTP 상태 코드가 302 Found 인 응답이 전송됩니다.

그러나 Turbo docs 에는 문제가 발생하지 않는 한 양식 제출에 대한 응답이 303 See Other 이어야 한다고 명시되어 있습니다.

그 이유는 302 Found에 대한 spec 상태로 리디렉션된 요청이 원래 요청과 동일한 HTTP 메서드를 사용해야 한다는 것입니다. 레거시 이유 때문에 대부분의 브라우저에서 fetch (내부적으로 Turbo에서 사용) 구현은 리디렉션된 경로에 302 Found 요청을 발행하여 POST 요청의 GET 응답에 응답합니다. 다른 모든 HTTP 메서드의 경우 리디렉션 시 원래 요청과 동일한 메서드를 사용합니다.
303 See Other 상태로 응답하면 리디렉션에 사용되는 방법이 항상 GET 입니다.

def create
  # ...

  redirect_to root_path, status: :see_other
end


Rails 양식은 GETPOST 의 두 가지 브라우저 기본 메서드만 사용하기 때문에 리디렉션 코드가 있는 이 이상 현상은 Rails에서 큰 문제가 아닙니다. 메소드가 다른 양식은 숨겨진 필드로 삽입된 메소드와 함께 사용하도록 렌더링됩니다POST. 그러면 요청이 컨트롤러에 도달하기 전에 Rails에서 구문 분석됩니다.

예를 들어:

<%= form_with(url: posts_path, method: :put) do |form| %>
  <%= form.text_field :name %>

  <%= form.submit %>
<% end %>


렌더링합니다

<form action="/posts" accept-charset="UTF-8" method="post">  
  <input type="hidden" name="_method" value="put">
  <input type="hidden" name="authenticity_token" value="...">

  <input type="text" name="name" id="name">

  <input type="submit" name="commit" value="Save">
</form>


그러나 이것은 Rails가 Turbo와 더 밀접하게 통합됨에 따라 잠재적으로 변경될 수 있습니다. 302 리디렉션이 문제가 될 수 있는 몇 가지 사용 사례가 이미 있습니다.

Turbo는 정의될 때 formmethod 속성에 지정된 방법을 사용하여 양식을 제출합니다. 아래 양식은 PUT 요청을 사용하여 제출합니다.

<%= form_with(url: posts_path) do |form| %>
  <%= form.text_field :name %>

  <%= form.submit formmethod: :put %>
<% end %>


컨트롤러가 302 Found를 사용하여 리디렉션한 경우 리디렉션된 경로에 대한 또 다른 PUT 요청이 발생합니다.

Turbo는 양식 제출을 가로채기 때문에 <form>method 뿐만 아니라 GETPOST 속성에서 모든 HTTP 메서드를 사용할 수 있습니다. 이 양식은 또한 PUT와 함께 제출됩니다.

<form action="/posts" accept-charset="UTF-8" method="put">  
  <input type="text" name="name" id="name">

  <input type="submit" value="Save">
</form>


Rails 양식 도우미는 이것을 렌더링하지 않지만 무엇이 가능한지 아는 것이 좋습니다!

따라서 Rails 앱에서 Turbo를 사용할 때 항상 303 See Other 상태 코드로 리디렉션하는 것이 좋습니다.

이 게시물이 마음에 든다면 내 책The Rails and Hotwire Codex을 확인하여 Rails 및 Hotwire 기술을 레벨 업하십시오!

좋은 웹페이지 즐겨찾기