오랫동안 Ruby and Rails 사용자로서, Rails에서 get-and-redirect 패턴에 대해 실제로 생각해 본 적이 없었습니다. 이것의 전형적인 예는 생성() 액션을 호출 한 다음 새로 만든 항목을 표시하는 표시() 액션에 사용자를 리디렉션 될 것이다 : 그러나redirect_to가 RESTful 앱에서 제대로 작동하지 않습니까?
class JournalEntries def index @entries = JournalEntry.all end def create @entry = JournalEntry.new(:name => "to-do list") @entry.save redirect_to :action => "index" end end
을, 이것은 당신이 고유의 단점이있다 네트워크 트래픽이 두 배로 증가합니다. 이렇게하면 대역폭 비용이 증가 할뿐만 아니라 사용자의 사이트 경험이 느려집니다.
은 왜 그냥 대신이 작업을 수행 할 :
def create @entry = JournalEntry.new(:name => "to-do list") @entry.save index
동일한 출력 및 불필요한 오버 헤드가 필요하지 않습니다. 그러나이 외에도 훨씬 더 심각한 문제가 있습니다. redirect_to는 GET을 사용하여 리디렉션 만 할 수 있습니다. 이로 인해 네 가지 HTTP 메소드를 사용하는 RESTful 앱에 큰 문제가 발생합니다.
제 경우에는 사용자가/journal/8을 호출하고 해당 ID로 저널을 검색 할 수 있기를 바랍니다. 발견되지 않으면, 나는 비어있는 새 저널 객체를 만들고 싶었습니다. 두 경우 모두 Journal 개체가 호출자에게 전송됩니다.
RESTful 레일스의 create() 메소드는 "POST/players"에서 라우팅된다는 점에 유의하십시오. 그러나 redirect_to (및 기본 HTTP 리디렉션)는 GET 요청 만 보낼 수 있기 때문에 실제로 index /() 메서드 인 "GET/players"로 리디렉션됩니다. 이 동작은 분명히 잘못되었습니다.
내가 생각할 수있는 유일한 해결책은 단순히 위의 예제에서와 같이 redirect_to() 대신 create()를 호출하는 것입니다. 잘 작동하는 것 같습니다.
redirect_to가 동작을 직접 호출하는 것보다 선호되는 이유에 대한 의견이 있으십니까?
두 번째 지점에 대한 주석. 내가 이해 한대로, REST의 한 가지 점은 결코 GET으로 업데이트를하지 않는 것이므로 결코 문제가 될 수 없다. –
@ 지미 : 적절한 REST에서는 동의하지 않을 것입니다. –
그래서 둘 다 말하는 것을 기반으로하면, 문제는 내가하려는 것은 본질적으로 비 안정적이라는 것입니다. 만약 존재한다면 객체를 반환하고 그렇지 않으면 객체를 생성하기를 원한다면 GET/journal/1 (레코드가 반환되지 않으면 클라이언트가 호출 함) POST/journals/[POST 데이터 : journal.id = 5] 맞습니까? 즉, 단일 작업으로 둘 다 수행하는 REST에는 원 샷 호출이 없습니다. – mrjake2