【发布时间】:2011-05-12 01:23:53
【问题描述】:
我正在尝试从控制器中的视图处理表单,但数据类型始终作为 HTML 而不是 JS 发送。该表单在以下 .js.erb 文件中呈现为一个名为“变量”:
views/ofertas/buscar.js.erb:
$('#variable').html("<%= escape_javascript( render('buscar')) %>");
呈现以下部分:views/ofertas/_buscar.html.erb:
<%= form_for @search, :html => {:remote => true, :'data-type' => 'script', :id => 'search_form'}, :url => {:controller => 'ofertas', :action => 'buscar'} do |f| %>
<%= f.text_field :search_words %>
<%= f.submit 'Buscar' %>
<% end %>
<div id='tabla'>
<%= render(:inline => @tabla) %>
</div>
现在,我已经尝试了表单上所有数据类型的组合。 'script'、'js'、删除该参数等... 这是控制器:controllers/ofertas_controller.rb:
def buscar
...
respond_to do |format|
format.js
end
end
奇怪的是,第一次调用控制器中的这个方法,是来自一个在渲染视图中看起来像这样的链接:
<a href="/ofertas/buscar?search_words=default" class="tabs" data-remote="true" data-type="js">lista de ofertas</a>
这非常有效,并且“变量”填充了表单。 Rails 控制台如下所示:
Started GET "/ofertas/buscar?search_words=default" for 127.0.0.1 at 2011-05-11 20:15:45 -0400
Processing by OfertasController#buscar as JS
Parameters: {"search_words"=>"default"}
... SQL stuff happens here ...
Rendered inline template (1.4ms)
Rendered ofertas/_buscar.html.erb (2.9ms)
Rendered ofertas/buscar.js.erb (4.5ms)
Completed 200 OK in 69ms (Views: 43.7ms | ActiveRecord: 0.6ms)
但是当我使用呈现的表单来访问同一个控制器方法时,请求总是作为 HTML 处理的。这是渲染视图的结果 HTML(在上面的 GET 之后):
<form accept-charset="UTF-8" action="/ofertas/buscar" data-remote="true" data-type="script" id="search_form" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓">
<input name="authenticity_token" type="hidden" value="Tpv4CESApK+Cf2tMchewm/B2nprBgEQKYmp7MvWBcfc=">
</div>
<input id="_search_words" name="[search_words]" size="30" type="text">
<input id="_submit" name="commit" type="submit" value="Buscar">
</form>
当我提交包含单词“1234”的搜索表单时,rails 控制台如下所示:
Started POST "/ofertas/buscar" for 127.0.0.1 at 2011-05-11 21:14:30 -0400
Processing by OfertasController#buscar as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Tpv4CESApK+Cf2tMchewm/B2nprBgEQKYmp7MvWBcfc=", "search_words"=>"1234", "commit"=>"Buscar"}
... SQL stuff happens here ...
Completed 406 Not Acceptable in 25ms
我知道这是因为处理为 HTML(Accept 标头为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5),但我不明白为什么请求以 HTML 格式发送。提交表单前的 Accept 标头如下:*/*, */*;q=0.5, text/javascript, application/javascript
请帮帮我,我在这件事上卡了一整天,一直没能取得进展。谢谢。
编辑:
好的,我终于找到了一个将handleRemote()事件附加到表单提交的函数。它实际上会查找页面中的所有表单,但由于只有一个,所以现在已经足够了。代码如下:
$(function(){
$("#tag_lista")
.live('ajax:complete', function(){
$("form[data-remote]").live('submit', function(e){
$.rails.handleRemote($("form[data-remote]"));
e.preventDefault();
});
});
});
【问题讨论】:
标签: jquery ajax ruby-on-rails-3 forms