2014-11-21 2 views
0

레일즈 4.0 어플리케이션에 상태 필드가있는 '주문'모델이 있습니다. 'show'액션을 호출하여 '주문'개체 세부 정보를 얻는 동안 'Edit'및 'Back'외에 'Show 페이지'에 추가 버튼을 추가하고 싶습니다. 첫 번째 것은이 주문 객체의 상태를 '1'로만 업데이트하는 '업데이트 상태'를 표시하고 두 번째 버튼은 '주문 닫기'를 표시하여이 주문 객체의 상태를 2로만 업데이트합니다. '편집'작업 /보기? 이 단추를 추가하려면 form_tag를 사용해야합니까? 그리고 상태를 업데이트하기 위해 OrdersController에 2 개의 새로운 메서드를 작성해야합니까? 나는 '배송'또는 '닫기'버튼들은 모두 'OrdersController가'로 호출됩니다 클릭하면 다음레일스는 폼이없는 필드를 업데이트합니다.

내가 추가하려는 두 개의 버튼 ...

<p> 
    <strong>Name:</strong> 
    <%= @order.name %> 
</p> 
<p> 
    <strong>Status:</strong> 
    <%= @order.status %> 
</p> 
<%= link_to 'Edit', edit_order_path(@order) %> | 
<%= link_to 'Back', orders_path %> | 
<%= link_to 'Shipped', '#', :name => 'shipped_button' %> | 
<%= link_to 'Close', '#', :name => 'close_button' %> 

내 show.html.erb입니다 아래와 같이 'GET'요청으로

은 .. 의해 2014년 11월 21일 15시 40분 38초 -0800
처리에 대해 127.0.0.1 "/ 명령/1-NAME = shipped_button"GET 시작 OrdersController # HTML로 표시
매개 변수 : { "name"=> "shipped_button", "id"=> "1"}
주문로드 (0.1ms) SELECT "주문". * "주문"어디에서 "주문". "id"=? LIMIT 1 [[ "ID", 1]]
렌더링 주문/레이아웃 내에서 show.html.erb/응용 프로그램 (1.9ms)이
50ms의에서 OK (200)을 완료 (조회수 : 47.8ms | 액티브 :는 0.1ms)

적절한 상태 필드 업데이트로 모델을 업데이트하려면 어떻게해야합니까? 'status'는 'orders'모델의 정수 필드입니다.

당신은 당신의 routes.rb 파일에 그런 일이 필요합니다

+0

나는 당신이 원하는 무엇을 알아낼 수 없습니다. 정말. 좀 더 자세히 설명해 주시겠습니까? 그러나 [질문] (http://stackoverflow.com/questions/5607155/ruby-on-rails-3-link-to-controller-and-action) –

+0

에 설명 된 것과 같이 link_to 함수에 액션을 전달할 수 있습니다. 예, 당신이 지적한 대답이이 경우에 효과가있는 것처럼 보입니다. link_to는 ID 또는 전체 객체를 입력 매개 변수로 사용하여 컨트롤러에서 작업을 호출하기 만합니다. – Atarang

답변

2

나는 아약스와 그렇게 할 것입니다.

resources :orders 

주문/show.html.erb :

<div id="order" data-order-id="<%= @order.id %>"></div> 

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Status:</strong> 
    <%= @order.status %> 
</p> 

<p> 
    <strong>Name:</strong> 
    <%= @order.name %> 
</p> 

<%= link_to 'Edit', edit_order_path(@order) %> | 
<%= link_to 'Back', orders_path %> 
<%= link_to 'Shipped', '',id: "ship" %> | 
<%= link_to 'Close', '', id: "close" %> 



<script> 
$(function() { 
    var orderId = $('#order').data("order-id"); 
    var shippButton = $('#ship'); 

    var closeButton = $('#close'); 
    alert(orderId); 



    closeButton.on("click", function() { 
     $.ajax({ 
      url: '/orders/'+orderId, 
      type: 'PATCH', 
      dataType: 'json', 
      data: {"order": { "status": "4"}}, 
      complete: function (jqXHR, textStatus) { 
       // callback 
      }, 
      success: function (data, textStatus, jqXHR) { 
       // inform user that it was a sucess like: 
       alert("successfully changed the order to closed"); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       // do something if the request fails 
      } 
     }); 
    }); 

    shippButton.on("click", function() { 
     $.ajax({ 
      url: '/orders/'+orderId, 
      type: 'PATCH', 
      dataType: 'json', 
      data: {"order": { "status": "3"}}, 
      complete: function (jqXHR, textStatus) { 
       // callback 
      }, 
      success: function (data, textStatus, jqXHR) { 
       // inform user that it was a sucess like: 
       alert("successfully changed the order to shipped"); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       // do something if the request fails 
      } 
     }); 
    }); 
}); 

</script> 
+0

@ auL5agoi, 감사합니다.이 변경 사항을 적용하고 내 답변을 업데이트하겠습니다. 그러나 전에 Javascript를 한 번도 해 본 적이 없기 때문에이 JS 함수를 어디에 넣을 까? show.html.erb? 그들은 HTML 태그의 일종입니까? – Atarang

+0

@Atarang Ah ok 스크립트 태그에이 태그를 넣을 수 있습니다.이 태그는 모두 show.html.erb 파일 안에 있습니다. 내 대답이 업데이트되었습니다. btw. 변경해야하는 속성을 설명하십시오. 예 : status : 1 일 때 x, status : 2 일 때 y 등. –

+0

@ auL5agoi, 아직 귀하의 제안을 시도하지 않았습니다. 주문형 모델은 {: new => 1, : open => 2, : => 3, : close => 4} 상태의 해시를 포함하고 '선적'또는 '닫기'를 클릭하는 것에 따라 모델의 '상태'필드에 적절한 값을 설정합니다. 왜 귀하의 접근 방식은 '나쁜'것으로 간주됩니까? JS 코드없이 같은 것을 달성하는 Rails의 방법은 무엇일까? – Atarang