【Rails】redirect_나는 to와render의 차이를 조사했다.

Rails 컨트롤러의create 동작과 업데이트 동작이 병렬된redirect와render입니다. 하지만 어떻게 다른지 아직 알 수 없기 때문입니다.처음에 공부할 때는 별로 신경 쓰지 않았는데 며칠 전에 두 가지 다른 질문을 받고 잘 대답하지 못했어요...

결론


【render】
컨트롤러에서 지정한view를 직접 호출합니다.
운동: controller → view
데이터 상태 그대로 화면 붙여넣기
【redirect_to】
http 요청을 받았을 때와 같은 처리
동작: controller → URL → route → controller → view
처음부터 지정된 URL에 액세스하여 모든 데이터를 다시 가져옵니다.

실제로 해봤어요.


① 일반적인 컨트롤러 파일의create 동작으로 동작을 관찰
tasks_controller.rb
 def create
   @task = Task.new(task_params)
   if @task.save
     redirect_to tasks_path, notice: "タスクを作成しました"
   else
     render :new
   end
 end 

인증이 걸리고 저장되지 않도록 작업 이름이 비어 있습니다.그런 다음 작업 만들기 를 누릅니다.

저장되지 않았습니다. "render:new"를 실행했습니다.입력한 데이터는 그대로 유지됩니다.
② render를 redirect로 대체해 보십시오.Prefix의 render와 동일합니다. new.html.호출erb를 지정합니다.
tasks_controller.rb
def create
  @task = Task.new(task_params)
  if @task.save
    redirect_to tasks_path, notice: "タスクを作成しました"
  else
    redirect_to new_task_path #render を redirect_to に置き換えた
  end
end

이번에도 일부러 빈 칸으로 작업 이름을 저장했다.작업 만들기를 누릅니다.

입력한 부분이 모두 빈 칸으로 변했다.이번 시험은 글자 수가 적어 문제없지만, 글자 수가 많은 블로그에 투고하려다 오류가 발생하면 쓴 글이 수포로 돌아간다.
이것은 어떤 어려움이 발생했을 때의 Rails 가이드입니다.

Rails Guide 설명


render 및redirect_to, Rails Guide의 설명은 다음과 같습니다.
Rails Guide 레이아웃 및 렌더링 2.3redirect_사용
render는 응답을 설정할 때 사용할 보기 (또는 다른 자원) 를 지정합니다.redirect_to 방법은 이 점에서 렌더 방법과 근본적으로 다르다.redirect_to 메서드는 브라우저에 명령을 보내기 위해 다른 URL로 요청을 다시 보내는 것입니다.
Rails Guide 레이아웃 및 렌더링 2.3.2 render 및 redirect_차이
redirect_to를 실행하면 코드가 거기에서 실행을 끝내고 브라우저에서 다음 요청 (정상 대기 상태) 을 기다립니다.그리고redirect_to에서 브라우저로 전송되는 HTTP 상태 코드 302에 따라 브라우저에서 서버로 다른 URL로 요청이 전송되고 서버는 이 요청을 다시 처리합니다.그 외에 나는 가지 않았다.
좀 이해가 안 돼...
다른 이쪽의 보도도 참고할 만하다. 나는 무슨 일이 일어났는지 안다.
render와redirect의 차이
render는 입력한 내용을 유지하면서 지정한view를 호출하여 화면을 다시 붙입니다.redirect_to http 요청을 다시 요청하고route와 controller를 통해 지정한view를 다시 호출합니다.
겸사겸사 말씀드리지만, 제가 또 하나 시도했습니다.
③ redirect_to를 렌더링해 보세요.
작업을 저장한 후 index 작업으로 이동합니다.
tasks_controller.rb
def create
  @task = Task.new(task_params)
  if @task.save
    render :index
  else
    render :new
  end
end
이번에는 작업을 저장하기 위해 작업 이름을 포함한 모든 항목을 입력합니다.

작업 만들기 를 누릅니다.

오류가 발생했습니다.인덱스입니다.html.eb의 실례 변수@task에 아무런 내용이 없기 때문일 수 있습니다.@task 컨트롤러의 index 조작으로 생성됩니다.지정한view를 호출해야 하지만 컨트롤러의 index 작업을 거치지 않았기 때문에 실례 변수를 만들지 않았다는 것이다.그래서 오류가 발생했을 수도 있다.
다른 한편,redirect_to를 사용해 보시면.
tasks_controller.rb
def create
  @task = Task.new(task_params)
  if @task.save
    redirect_to tasks_path
  else
    render :new
  end
end
저장할 항목을 모두 입력합니다.

작업 만들기를 누릅니다.

작업이 저장되어 index 보기로 이동합니다.

좋은 웹페이지 즐겨찾기