새로운 레일 대 생성


195

RESTful 컨트롤러에서 새 메소드를 정의해야하는 이유는 무엇이며 작성 메소드로 후속 조치를 수행해야합니까?

Google 검색에서 원하는 답변을 얻지 못했습니다. 나는 그 차이점을 이해하지만 그들이 왜 그렇게 사용되는지 알아야합니다.

답변:


263

Rails의 REST 구현에서 new 와 create 는 다르게 취급됩니다.

는 HTTP GET에 /resources/new호출하여이하는 새로운 자원을 생성에 적합한 형태로 렌더링하기위한 것입니다 새를 , 컨트롤러 조치 저장하지 않은 새 레코드를 작성하고 양식을 렌더링합니다.

HTTP POST /resources는 새 조치의 일부로 작성된 레코드 를 가져 와서 제어기 내의 작성 조치로 전달한 다음 데이터베이스에 저장하려고합니다.


1
나는 레일즈 튜토리얼 사이트에서이 정보를 정확히 감추었다. 실제로 사용하기 전까지는 그렇지 않았습니다.
— StorymasterQ

248

로부터 액티브 :: 자료 문서 :

작성 (속성 = nil) {| object | ...}

유효성 검사가 통과되면 개체 (또는 여러 개체)를 만들어 데이터베이스에 저장합니다. 결과 오브젝트는 오브젝트가 데이터베이스에 성공적으로 저장되었는지 여부에 관계없이 리턴됩니다.

new (속성 = nil) {| self_block_given? | ...}

새 객체는 비어 있거나 (구성 매개 변수를 전달하지 않음) 속성을 사용하여 사전 설정되어 있지만 아직 저장되지 않은 상태로 인스턴스화 할 수 있습니다 (관련 테이블 열 이름과 일치하는 키 이름을 가진 해시를 전달). 두 경우 모두 유효한 속성 키는 연결된 테이블의 열 이름에 따라 결정되므로 테이블 열에 속하지 않은 속성을 가질 수 없습니다.

따라서 create새 개체를 인스턴스화하고 유효성을 검사 한 다음 데이터베이스에 저장합니다. 또한 new로컬 객체 만 생성하지만 DB에 유효성 검증 또는 저장을 시도하지는 않습니다.


5
이 질문은 모델 방법이 아닌 컨트롤러 방법에 관한 것입니다.
— sevenseacat

8
@Karpie-downvote에 감사드립니다. 좋은 지적이지만, 제목이나 태그가 컨트롤러 전용 질문이라고 부르지 않기 때문에 많은 사람들이이 답변이 유용하다고 생각합니다. 따라서이 답변은 동일한 가치를 제공한다고 생각합니다.
— 저스틴에 티어

16

New는 새 Model 인스턴스를 인스턴스화하지만 save 메소드가 호출 될 때까지 저장되지 않습니다.

Create는 new와 동일하지만 데이터베이스에 저장합니다.

때로는 데이터베이스에 무언가를 저장하기 전에 무언가를하고 싶을 때가 있습니다.


1
이 질문은 모델 방법이 아닌 컨트롤러 방법에 관한 것입니다.
— sevenseacat

11

Rails의 RESTful 부분은 HTTP 프로토콜의 작동 방식에 매우 가깝습니다. HTTP 프로토콜에서 GET 요청은 데이터를 수정하지 않아야합니다. 논리적으로 Rails의 모든 RESTful 작업이 작동하는 방식을 살펴보면 HTTP 작업과 일치합니다. POST는 새 데이터를 생성하기위한 것으로 논리적으로 생성됩니다. GET을 사용하여 양식 버전 또는 다른 방식으로 새 조치를 제공합니다. 인덱스와 쇼도 GET이고, 업데이트는 PUT (또는 Rails 4+의 PATCH)이며, destroy는 HTTP의 DELETE입니다.

또한 컨트롤러의 로직을 멋지게 분리하고 오류 메시지를 사용하여 새 작업을 다시 렌더링하여 오류를 원활하게 처리 할 수 ​​있습니다.


"You use a GET to serve the form version of that or in other words, the new action"답변 주셔서 감사하지만 개인적으로 나는이 명명 규칙은 정말 혼란 스러워요
— Daniel Lizik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.