2014-11-26 4 views
0

"장바구니"를 만들고 사용자가 장바구니에있는 항목의 수량을 업데이트 할 수 있도록 할 계획입니다. 장바구니 품목에 대한 제거 링크가 있지만 사용자가 기술적으로 "제거"버튼을 누르는 대신 "0"을 입력 할 수 있습니다. 따라서 "update"에서 @ cart.item.quantity == 0인지 확인하고, 그렇다면 컨트롤러의 destroy 액션으로 리디렉션합니다.컨트롤러의 다른 동작으로 리디렉션하는 가장 좋은 방법

무엇이 가장 깨끗한 해결책입니까? 여기에 내가 시도했지만 작동하지 않는 것입니다, 그리고 난 내 컨트롤러에서의하지 깨끗한 접근 ...

을 생각하고 :

def update 
    if @cart_item.quantity == 0 
     render action: :destroy 
    else 
     respond_to do |format| 
     if @cart_item.update(cart_item_params) 
      format.js#on { head :no_content } 
     else 
      format.json { render json: @cart_item.errors, status: :unprocessable_entity } 
     end 
     end 
    end 
    end 

    def destroy 
    @cart_item.destroy 
    respond_to do |format| 
     format.js 
    end 
    end 

답변

1

render이 작업을 실행하지 않습니다. 그것의 아마 조금만 더 destroy 행동 리디렉션을 사용하여

def update 
    if @cart_item.quantity == 0 
     @cart_item.destroy 
    else 
     respond_to do |format| 
     if @cart_item.update(cart_item_params) 
      format.json { head :no_content } 
     else 
      format.json { render json: @cart_item.errors, status: :unprocessable_entity } 
     end 
     end 
    end 
    end 

update 자체 대신 리디렉션에 카트 항목을 파괴 :

def update 
    if @cart_item.quantity == 0 
     redirect_to action: :destroy, id: @cart_item.id 
    else 
     respond_to do |format| 
     if @cart_item.update(cart_item_params) 
      format.js#on { head :no_content } 
     else 
      format.json { render json: @cart_item.errors, status: :unprocessable_entity } 
     end 
     end 
    end 
    end 

    def destroy 
    @card_item = CartItem.find(params[:id]) #not sure if you are doing this elsewhere 
    @cart_item.destroy 
    respond_to do |format| 
     format.js 
    end 
    end 
+0

@ cart_item.destroy가 내 destroy.js로 응답하거나 그걸 호출해야합니까? –

+1

그렇지 않습니다. destroy.js로 응답하려면 리디렉션이 더 좋을 것입니다. 리디렉션이 작동하지 않는 것 같아서 – usha

+0

에 대한 대답을 업데이트합니다. 그냥 @ cart_item.destroy를 사용하고 나서 destroy.js를 렌더링해야할까요? –

0

첫 번째 대답은 작업을 실행하지 않습니다 렌더링이 올바른 것입니다. Render는 컨트롤러의 현재 상태를 취한 다음 뷰를 그립니다. 그러나 그분의 기능을 그대로 부르면 문제가 생깁니다. 항목을 삭제하지만 삭제보기를 렌더링하지 않으므로 아약스 호출이라고 가정하면보기를 올바르게 업데이트하지 않습니다. 당신이 컨트롤러 기능을 실행하려면

당신은 두 가지 선택이 있습니다

  1. redirect_to의 your_destroy_action_path (@cart_item를) - 내가 여기서 잘 모르겠어요 한 가지는 당신이 할 때 얼마나 잘 아약스 작품입니다 아약스 전화를 누른 다음 리디렉션으로 그걸 따라해라. 나는 액션이 ​​여전히 실행될 것이라고 생각하지만 아약스보기 코드가 그 수준의 간접 지정으로 올바르게 처리되는지 확실하지 않습니다. (나는 그것이 것하지만 나 자신을 코딩 해본 적이 생각하고 싶습니다.)

  2. 전화 당신이 현재있는 장소에 파괴 기능 :

    조치를 렌더링을 :

    그래서 파괴 그것은됩니다 :

def update 
 
    if @cart_item.quantity == 0 
 
     destroy 
 
    else 
 
     respond_to do |format| 
 
     if @cart_item.update(cart_item_params) 
 
      format.js#on { head :no_content } 
 
     else 
 
      format.json { render json: @cart_item.errors, status: :unprocessable_entity } 
 
     end 
 
     end 
 
    end 
 
    end 
 

 
    def destroy 
 
    @cart_item.destroy 
 
    respond_to do |format| 
 
     format.js 
 
    end 
 
    end

+0

나는 당신의 대답처럼 파기를 사용하여 간단히 시도했지만, 파멸시키지 만, 내 파멸을 되 돌리지는 않는다. –

+0

실제로는 신경 쓰지 않는다. 콘솔을 열어보고 있었는데 아이템을 파괴하지 않았습니다.수량이 0으로 설정되고 항목이 계속 존재합니다. –

0

나는 컨트롤러를 가능한 한 깨끗하게 유지하고 싶다.

만약 이것을 개발한다면 수량이 0인지 확인하는 Jquery 함수를 만들고 예인 경우 PUT 대신 DELETE로 폼 동작을 변경하십시오.

+0

나는 이것도 생각했다. 가능하다면 컨트롤러에서 이것을하는 법을 알고 싶다. 클라이언트 쪽에서 먼저 수량을 확인한 다음 수량에 따라 액션을 파괴하라는 지시를 받는다. 실제로 이것이 최선의 방법 일 수 있습니다. –

+0

1. 버튼에 클래스 추가 2. 해당 클래스의 JQUERY onclick 설정 3. 필요한 경우 양식 $ ("form"). attr ("action", "newValue")의 값 변경 –

관련 문제