2013-05-30 8 views
1

я следующая ситуация:Рубин на Rails - вызов метода контроллера и передать ему параметры

У меня есть модель риска и на мой взгляд, показывает мне таблицу со всеми рисками. В таблицу также входит , так как каждый риск должен быть проверен. В табличной таблице есть кнопка, и если эта кнопка нажата, следует вызвать метод контроллера риска, и он должен иметь все проверенные идентификаторы риска в качестве параметра.

На самом деле, я не знаю, какой был бы лучший способ решить эту проблему.

Я следующий код до сих пор:

Вид:

<table> 
    <thead> 
    <tr> 
     <th>Risk Name</th> 
     <th> 
     <button id="mergerisks">Merge Risks</button> 
     </th> 
    </tr> 
    </thead> 
    <tbody> 
    <% Risks.all.each do |risk| %> 
     <tr> 
      <td><%= risk.name %></td> 
      <td><%= check_box_tag 'mergerisks', risk.id %> 
      </td> 
     </tr> 
    <% end %> 
</tbody> 
</table> 

Javascript:

$("#mergerisks").on("click", function() { 
    var selectedriskmerge = new Array(); 
    $("input:checked").each(
     function() { 
     selectedriskmerge.push($(this).val()); 
    }); 
    }); 

Редактировать Добавлено следующее Ajax вызов яваскрипта

$.ajax({ 
    url: '/riskmerge', 
    data:selectedriskmerge, 
    success:function() { 
    window.alert("Success!"); 
    } 
}); 

На данный момент кнопка запускает только Javascript, и есть идентификаторы всех отмеченных. Риски хранятся в массиве.

Но теперь я не знаю, как было бы лучшим способом вызвать метод контроллера в контроллере риска и передать идентификаторы всех проверенных рисков методу.

Спасибо за любую помощь.

+0

Задумывались ли вы делать что-то в AJAX? – jason328

+0

Да, я подумал об этом, но поскольку у меня нет опыта с AJAX, я действительно не сейчас, что искать. Не могли бы вы рассказать мне, как это можно сделать с AJAX? –

ответ

0

ПРИМЕЧАНИЕ: Это немного отличается от того, что вы хотели, но может обеспечить лучший пользовательский интерфейс, так как им не придется нажимать на дополнительную кнопку в конце, чтобы обновлять записи, поэтому прислушайтесь с осторожностью. Независимо от того, что вы получите достойный пример того, как использовать ajax для своих нужд.

Сначала вам нужно создать в контроллере действие, которое обновит требуемую запись, которую вы уже имеете. Твист заключается в том, что вместо рендеринга html вам нужно будет отобразить json в конце. Что-то вроде этого.

if risk.update_attribute(check: true) 
    render :json => { status: "Everything worked!"} 
else 
    render :json => { status: "Something went wrong!"} 
end 

Далее вы хотите настроить JavaScript, так что, когда флажок щелкнули, Аякса сообщение посылается к действию, который обновляет запись. Вы частично это сделали с вашим javascript. Внутри вашего события click вы можете получить что-то вроде

$.post("/risk_update", 
     // This line below is the parameters sent to the action. 
     //So your action will recognize params[:risk_id] 
     { risk_id: $(".clicked_check_box").attr("value") }, 
     "json") 
     .done(function (responseText) { 
     if (responseText.status === "Everything worked!") { 
      // Do something on success of info being saved 
     } else if (responseText.status === "Something went wrong!") { 
      // Do something on failure of info being saved 
     } 
     }); 

И, наконец, есть проблема с этим флажком. Вы хотите, чтобы пользователь снял флажок и снова вызывал запись. Это, конечно, выходит за рамки обсуждения вопроса, но это некоторые вещи, которые вы должны иметь в виду.

Конечно, в вашем случае вам нужно нажать кнопку, которая захватывает все идентификаторы и отправляет их в действие для обновления записей. Один из способов заключается в том, чтобы javascript вводил идентификатор в массив, когда отмечен флажок, а затем, когда пользователь нажимает кнопку отправки, массив отправляется в качестве параметров для действия, которое затем перебирает массивы и обновляет риски.

Я уверен, что есть лучшие способы, но это только первое, что пришло в голову.

+0

thx для вашего ответа, как вы можете видеть в моем редактировании выше, я добавил вызов ajax и, похоже, работает. Вы знаете, как я могу получить доступ к массиву params в методе контроллера? –

+0

Один трюк для выяснения того, что вызовет params, заключается в его входе в ваш файл 'development.log'. Попробуйте поместить 'Rails.logger.debug (params.inspect)' внутри действия вашего контроллера, который обновляет записи. Затем попробуйте свои флажки и, наконец, посетите файл 'development.log'. Вы должны заметить, что где-то рядом с дном файла хеш params был выплюнут, и вы увидите ключ, который указывает на ваш 'selectedriskmerge'. Это, конечно, КАК вы отлаживаете свои параметры. Опять я оставляю вам возможность найти ответ. – jason328

+0

жаль, что мне потребовалось столько времени, чтобы ответить вам снова, еще раз спасибо за вашу помощь! подсказка для использования Rails.logger.debug() спасла меня много времени :) –

0

Лучше всего разместить все флажки внутри формы.

<%= form_tag controller_method_name_your_controller_path, :method => 'get', do %> 
    ... 
    <%= submit_tag 'submit' %> 
<% end %> 

Объявить путь в routes.rb файл под your_controller

get :controller_method_name 

Вы можете группировать вы флажков вместе с помощью check_box:

<%= check_box 'mergerisks', risk.id %> 

Затем с помощью params[:mergerisks] в контроллере будет вернуть хэш с risk.id в качестве ключей и 1 or 0 в зависимости от того, установлен ли флажок.

Некоторая документация на маршрутах и ​​формах:

http://guides.rubyonrails.org/routing.html

http://guides.rubyonrails.org/form_helpers.html

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