복붙노트

[RUBY-ON-RAILS] redirect_to하고 교환 렌더링?

RUBY-ON-RAILS

redirect_to하고 교환 렌더링?

반대의 렌더링 또는 그와 redirect_to를 교체 할 경우 발생하는 아래의 코드에 대해서는?

def create
  @product = Product.new(params[:product])

  respond_to do |format|
    if @product.save
      format.html { redirect_to(@product, :notice => 'Product was successfully created.') }

    else
      format.html { render :action => "new" }
    end
  end
end

그것은 위의 코드에서 다른 하나를 대체 OK 보인다. 단지 redirect_to 또는 렌더링을 사용하는 곳이 있습니까? 렌더링 아무것도하지만 뷰를 렌더링하지 않습니다. Redirect_to는 서버 (302) 요청을 보내고 현재의 매개 변수를 리디렉션 후 손실됩니다.

감사.

해결법

  1. ==============================

    1.이 때 사용자 새로 고침, 페이지를 렌더링 사용하는 경우, 다시 이전 POST 요청을 제출합니다. 이 중복 구입 및 다른 사람과 같은 바람직하지 않은 결과가 발생할 수 있습니다.

    이 때 사용자 새로 고침, 페이지를 렌더링 사용하는 경우, 다시 이전 POST 요청을 제출합니다. 이 중복 구입 및 다른 사람과 같은 바람직하지 않은 결과가 발생할 수 있습니다.

    그러나 사용자가 새로 고침 페이지가, 다시 같은 페이지를 요청할 단지 때 당신은 redirect_to를 사용하는 경우. 이것은 또한 포스트 / 리디렉션 / 가져 오기 (PRG) 패턴으로 알려져있다.

    당신이 HTTP POST 요청을 수행 할 때 redirect_to 사용되어야하는 장소입니다 그리고 당신은 그것을 (중복 항목 및 기타 문제를 일으킬 수있는) 끝나면 사용자가 요청을 다시 제출하지 않아도됩니다.

    모델이 구원에 실패 할 경우 레일에서, 이전에 작성했던 것과 동일한 항목과 양식을 다시 표시하는 데 사용됩니다 렌더링합니다. 이것은 당신이 리디렉션을 사용하는 경우, 당신은 매개 변수 또는 세션을 사용하거나 양식 항목을 통과해야하기 때문에 간단합니다. 부작용은 브라우저를 새로 고침하는 경우, 그것은 이전의 형태로 항목을 다시 제출하려고 할 것입니다. 아마 같은 방식으로 실패 때문 허용, 또는 지금 성공의 경우, 사용자가 어쨌든 처음에 기대해야하는지이었다.

    깊이 설명에서 더에 대한 렌더링 및 리디렉션을 위해, 당신은이 기사를 읽어야한다.

  2. ==============================

    2.당신이 컨트롤러 메소드 안타 새 요청을 생성합니다 리디렉션하면 바로 관련 뷰를 렌더링 렌더링합니다. 당신은에서 렌더링 사용하면 저장이 당신의 오류에 대한 정보를 렌더링 할 수 있도록 실패 할 경우 모델 객체의 상태를 유지하기를 원하기 때문에 만들 수 있습니다. 당신이 new_product 경로로 리디렉션하려고하면 새 모델 객체를 생성하고 사용자가 입력 한 모든 양식 데이터를 느슨하게하고 오류 등 등 것

    당신이 컨트롤러 메소드 안타 새 요청을 생성합니다 리디렉션하면 바로 관련 뷰를 렌더링 렌더링합니다. 당신은에서 렌더링 사용하면 저장이 당신의 오류에 대한 정보를 렌더링 할 수 있도록 실패 할 경우 모델 객체의 상태를 유지하기를 원하기 때문에 만들 수 있습니다. 당신이 new_product 경로로 리디렉션하려고하면 새 모델 객체를 생성하고 사용자가 입력 한 모든 양식 데이터를 느슨하게하고 오류 등 등 것

    (일부 추가 정보를 포함) 편집 :

    뷰 템플릿은 당신이에서 리디렉션 컨트롤러 방법으로 초기화되지 않은 인스턴스 변수를 사용하는 경우는 redirect_to를 사용해야 상황의 예입니다. 당신은 아마 전화 렌더링 할 수 있도록 :에 {행동 => '인덱스'} 인덱스 템플릿 아마 @products 변수를 사용합니다 있기 때문에 유일한 초기화 @product는 예외를 일으킬 것입니다 귀하의 방법을 만들

  3. ==============================

    3.여기에 두 가지 방법은 내가 따라 않는 것이 무엇의 전체 목록은 다음과 같습니다

    여기에 두 가지 방법은 내가 따라 않는 것이 무엇의 전체 목록은 다음과 같습니다

    1) redirect_to는 기본적으로 HTTP 302 상태 코드를 발급합니다. 302 리디렉션은 임시 변화와 사용자를 리디렉션과가 제거 될 때까지 제한된 시간 동안 원하는 페이지에 검색 엔진. 선택적 redirect_to에 301 상태 코드를에서 지정할 수 있습니다. 모든 페이지는 완전히 다른 위치로 이동 된 때 상태 코드 301을 사용한다. 그것은 기존의 페이지를 교체 것처럼 사용자는 이제 새로운 페이지가 표시됩니다. 이 검색 엔진 결과에 표시 할 때 페이지의 URL을 변경합니다.

    그것은 다른 컨트롤러 액션 또는 URL로 리디렉션 때문에 2) redirect_to는 새로운 HTTP 요청을 발행합니다. 당신은 당신이 redirect_to를 사용하는 경우 당신은 정말 그렇게 항상에 질문이하지 않는 새로운 호출을 할 수있는 브라우저가 필요합니다 그것은 아마도 옳은 일 경우, 또는 더 나은 것 렌더링 안된다. - redirect_to는 현재의 액션의 자동 템플릿 렌더링이 생략하게됩니다.

    3) 기본적으로 HTTP 200 상태 코드를 발행합니다 렌더링 (그러나 잘못된 액티브 오브젝트와 함께, 당신은) 422 개의 처리 할 엔티티로 변경 할 수 있습니다. 는 HTTP 200 OK 성공 상태 응답 코드는 요청이 성공했음을 나타냅니다. 422 (엔티티 처리 할 수 ​​없음) 상태 코드를 요청 엔티티 ND 요청 엔티티의 구문의 내용 타입을 이해 맞지만 포함 된 명령어를 처리 할 수 ​​없습니다 의미한다.

    4) 템플릿과 템플릿이 사용할 수있는 제어 동작에 정의 된 인스턴스 변수를 렌더링하는 렌더링. 물론, 인스턴스 변수는 경우가 후속 조치가 redirect_to가 호출하는 사용할 수 없습니다. 중요 포인트 : 리디렉션은, 그래서 당신은 다른 템플릿을 렌더링하지 않는 경우 렌더링 동안은 사용할 수 없습니다 그 템플릿으로 그 인스턴스 변수 있도록 관련 작업을 공격하지 않을 것이다 컨트롤러 안타!

    5) 대신 일반 플래시, 사용 flash.now 렌더링으로.

    flash.now[:error] = "There was a problem"  
    # not 
    flash[:error] = "There was a problem"
    

    6) 당신은 다음 플래시 메시지가 렌더링거야 페이지에 표시되지 않을 수도 있습니다, 그것은 방문있어 다음 페이지에 표시됩니다.

    7)을 실행 중지하려면 현재의 액션을 발생하지 않습니다 렌더링! redirect_to 정지 현재 작업이 실행되지 않습니다 원인! 당신은 당신이 작업 코드의 추가 실행 우회해야하는 경우 '수익'을 호출 할 필요가! 코드 아래에서 명시 적 하단에 렌더링 및 리디렉션의 오류를 방지하고 모두 존재 선물을 렌더링하는 수익을 수행해야합니다 그래서 당신이 있습니다 :

    def update
      @record = Record.new(record_params)
      if @record.save
        flash[:success] = "record was successfully saved"
        redirect_to records_path
        return
      end
      flash.now[:error] = "please fix the problems in the record"
      render :edit
    end
    

    또 다른 옵션 :

    def update
      @record = Record.new(record_params)
      if @record.save
        flash[:success] = "record was successfully saved"
        redirect_to records_path
      else
        flash.now[:error] = "please fix the problems in the record"
        render :edit
      end  
    end
    

    8) 플래시 메시지가 행동의 차이에 따른 일시적 원시 - 타입 (문자열, 배열, 해시)를 통과 할 수있는 방법을 제공합니다. 당신이 플래시에 배치 아무거나는 바로 다음 행동에 노출 된 후 밖으로 삭제됩니다. 이 통지 및 경고를하는 좋은 방법입니다 :

    class PostsController < ActionController::Base
      def create
        # save post
        flash[:notice] = "Post successfully created"
        redirect_to @post
      end
    
      def show
        # doesn't need to assign the flash notice to the template, that's done automatically
      end
    end
    
    show.html.erb
      <% if flash[:notice] %>
        <div class="notice"><%= flash[:notice] %></div>
      <% end %>
    

    당신이 플래시에 모두 공지 사항 및 경고를 할 수 있기 때문에, 당신은 모두 고지를 표시하고이 방법을 경고 할 수 있습니다 :

    <% flash.each do |key, value| %>
      <%= content_tag :div, value, class: "flash #{key}" %>
    <% end %>
    
  4. from https://stackoverflow.com/questions/7493767/are-redirect-to-and-render-exchangeable by cc-by-sa and MIT license