2014-11-21 3 views
0

У меня есть приложение Rails 4.0 с моделью «порядок», у которой есть поле статуса. Вызывая действие «показать», чтобы получить детали объекта «заказ», я хочу добавить дополнительные кнопки на странице «Показать» в дополнение к «Редактировать» и «Назад». Сначала отметьте «статус обновления», который будет обновлять статус этого объекта заказа до «1», а вторую кнопку - «закрыть заказ», который будет обновлять статус этого объекта заказа до 2. Как я могу достичь этого без «Изменить» действие/просмотр? Нужно ли использовать form_tag для добавления этих кнопок, и мне нужно написать 2 новых метода в OrdersController для обновления статуса?Rails обновляет поле без формы

Ниже мой show.html.erb с двумя кнопками, которые я хочу добавить ...

<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' %> 

Если я нажимаю на «Доставлено» или кнопку «Закрыть», они оба будут призваны «OrdersController» как запрос 'GET', как показано ниже,

.. работы GET "/ заказы/1? имя = shipped_button" для 127.0.0.1 в 2014-11-21 15:40:38 -0800
обработки по OrdersController # показать как HTML
Параметры: {"name" => "shipped_button", "id" => "1"}
Заказать груз (0,1 мс) ВЫБЕРИТЕ «заказы». * FROM «заказы» WHERE «заказы». «Id» =? LIMIT 1 [[ "ID", 1]]
Оказываемые заказы/show.html.erb в макетах/приложений (1.9ms)
Завершено 200 OK в 50 мс (Просмотров: 47.8ms | ActiveRecord: 0,1 мс)

Как обновить модель с соответствующим обновлением поля состояния. «status» - целое поле в модели «заказов».

+0

Я не могу понять, что вы хотите. действительно. Не могли бы вы объяснить это более подробно? Однако вы можете передать действия функции link_to, как описано в этом вопросе [http://stackoverflow.com/questions/5607155/ruby-on-rails-3-link-to-controller-and-action) –

+0

Да, этот ответ, который вы указали, выглядит как бы в этом случае. link_to просто вызывает действие в контроллере с id или целым объектом в качестве входного параметра. – Atarang

ответ

2

Я хотел бы сделать это с помощью AJAX:

Вам нужно что-то подобное в вашем routes.rb файл.

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 Ах, вы можете обернуть их в тег скрипта, это все внутри вашего файла show.html.erb. обновил мой ответ. Кстати. Опишите, какие атрибуты вам нужно изменить: например: статус: 1, когда x, статус: 2, когда y включен. –

+0

@ auL5agoi, я еще не пробовал ваше предложение. У меня есть модель Order, у которой есть STATUSES Hash с {: new => 1,: open => 2,: shipped => 3,: close => 4} и в зависимости от клика на «отгруженном» или «закрытом» мне нужно для установки соответствующего значения в поле «статус» в модели. Почему ваш подход считается «плохим»? Каким будет способ Rails для достижения одного и того же без JS-кода? – Atarang

Смежные вопросы