我似乎无法获得具有多个提交控件的:remote
表单,以便在Rails 3下工作。以下代码:
<%= form_tag({:action => 'debug'}, {:remote => true}) do %>
<%= submit_tag "Foo" %>
<%= submit_tag "Bar" %>
<% end %>
生成一个带有两个按钮的表单,但生成的AJAX POST不包含commit
参数来说明哪一个被按下。如果我退出:remote => true
,则正常的POST确实包含commit
参数。
有没有办法让这项工作,或者它只是一个错误?
答案 0 :(得分:1)
经过一番游戏后,我想我找到了解决方案。
问题是rails.js
在包含点击的serializeArray()
控件的form
元素上使用submit
;但表单的序列化数据不包含该控件。但是,JQuery或Javascript正在跟踪调用链中的原始事件,这在技术上是适当控件上的“提交”事件。
所以我按如下方式编辑了rails.js:
callRemote: function (e) { /* Note - new parameter e */
var el = this,
method = el.attr('method') || el.attr('data-method') || 'GET',
url = el.attr('action') || el.attr('href'),
dataType = el.attr('data-type') || 'script';
if (url === undefined) {
throw "No URL specified for remote call (action or href must be present).";
} else {
if (el.triggerAndReturn('ajax:before')) {
var data = el.is('form') ? el.serializeArray() : [];
/********************/
/* Note new if-test */
/********************/
if (e)
{
data.push({name: e.originalEvent.explicitOriginalTarget.name,
value: e.originalEvent.explicitOriginalTarget.value})
}
/* Function continues as before */
......再往下......
$('form[data-remote]').live('submit', function (e) {
$(this).callRemote(e);
e.preventDefault();
});
这样可以在触发AJAX之前添加单击按钮的名称 - 值对。
我对Javascript有点新鲜,所以如果有任何错误,请告诉我!
答案 1 :(得分:1)
我尝试了你的解决方案,它适用于Firefox,但随后该应用程序不再适用于IE和Safari。现在我找到了另一种解决方案:只需通过一个小的javascript将提交按钮的值放入隐藏的输入字段中。
<input id="selected_button" type="hidden" name="commit" value=""/>
<script>
function identify_button( el ) {
window.document.getElementById( 'selected_button' ).value = el.value;
}
</script>
<input class="button"
type="submit"
name="commit"
value="Save"
onclick="identify_button( this )" );"
/>
<input class="button"
type="submit"
name="commit"
value="OK"
onclick="identify_button( this )" );"
/>