Хорошо. Я считаю, что нашел хорошую реализацию этого.
Фокус в том, чтобы создать форму, инкапсулирующую кнопку, чтобы попасть в правильный контроллер, когда нажимается кнопка. В моем случае, я использовал рельсы form_tag
функцию, чтобы генерировать свою кнопку в течение моего _list_item.html.erb
частичного вида на мой контроллер для разработчиков следующим образом:
<div id=<%= list_item.id %>>
<%= form_tag "/Developer/toggle", :method => "get", :remote => true do %>
<p>
<% if list_item.inactive? %>
<%= submit_tag "Activate", :name => nil %>
<input type="hidden" name="act" value="activate" />
<% else %>
<%= submit_tag "Deactivate", :name => nil %>
<input type="hidden" name="act" value="deactivate" />
<% end %>
</p>
<input type="hidden" name="dev_id" value=<%=list_item.id%> />
<% end %>
</div>
Есть 2 вещи, которые должны быть призваны вниманием в этом частично.
- Поскольку это частичная визуализация как часть списка, вы должны дать каждому элементу списка уникальный идентификатор, чтобы ваш javascript действовал только на этом элементе. Это делается в первой строке,
<div id=<%= list_item.id %>>
, которая, как я знаю, будет уникальной, потому что каждый разработчик в списке обязательно имеет уникальный идентификатор.
:remote => true
является необходимым аргументом для функции form_for
. Это то, что заставляет запрос делать в фоновом режиме, а не загружать новую страницу.
Эта форма, когда представлены хиты мой Developer#toggle
действия с двумя параметрами: act
, который является либо activate
или deactivate
и id
который является идентификатор разработчика мы действуем на. Оба этих параметра являются скрытыми полями в форме.
После отправки формы внутри контроллера я просто получаю экземпляр правильного разработчика (в моем случае это довольно сложно, но в большинстве случаев это, вероятно, что-то вроде @dev = Developer.find(id)
) и выполняет этапы необходимо активировать/деактивировать разработчика.
И, наконец, я создал файл toggle.js.erb
в каталоге вида для моего контроллера разработчика, который получает визуализацию после того, как контроллер выполнил свою задачу. Этот файл просто получает элемент (через уникальный идентификатор мы дали его частичный) и заменяет внутренний HTML путем повторного рендеринга парциального следующим образом:
document.getElementById("<%=escape_javascript(@dev.id)%>").innerHTML="<%=escape_javascript(render :partial => 'developer/list_item', :object => @dev) %>";
результата является частичным существо повторно вынесен после того, как изменилось активное состояние разработчиков, в результате чего появилась соответствующая кнопка Activate
или Deactivate
.
Я понимаю, что этот ответ очень сфокусирован на моем конкретном приложении, особенно для того, чтобы иметь дело с переключением активных и неактивных, однако я считаю, что он легко упрощается и адаптируется к другим случаям, которые могут потребовать меньшей сложности.
Спасибо за ответ. Это помогает мне понять, что они думают в правильном направлении. Не могли бы вы немного разобраться? Как это будет сделано более конкретно? Может ли блок '// ваш код здесь 'содержать код ruby? Есть ли полезные советы по этому поводу? – finiteloop
@finiteloop, посмотрите на редактирование. –