【问题标题】:Rails 3: Can't get form to be processed as javascript instead of HTMLRails 3:无法将表单作为 javascript 而不是 HTML 处理
【发布时间】: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


    【解决方案1】:

    我可能没有抓住重点,但是您如何处理表单的提交?

    如果您将事件附加到页面以处理第一个表单的提交,则必须重新将事件附加到新创建的表单,即在您提交之后第一次。

    查看 jQuery 的 live,作为处理此问题的一种方式。

    【讨论】:

    • 实际上可能就是这样。因此,当我通过 .js.erb 文件生成表单时,我必须将提交事件附加到该新表单。但由于我是 jQuery 新手,你能告诉我我将如何去做吗?我怀疑我必须将事件 callFormSubmitBindings 从 rails.js 文件绑定到表单,但我不知道如何或在哪里......
    • 我还不是 100% 熟悉 Rails 3,所以……你的 rails.js 文件是什么样的?目前该事件是如何附加到表单的?
    • 我真的不知道。我猜它会在加载视图时自动执行。 rails.js 是用于在 Rails 中使用 jQuery 的默认 js 文件。那里有一个名为 handleRemote(element) 的方法,似乎可以进行 ajax 调用。但是我尝试在表单呈现如下时附加事件:$(function(){ $("#tag_lista") .live('ajax:complete', function(){ $("#select_form").submit($.rails.handleRemote($(this))); }) }); 但现在事件似乎在不断触发,而我没有点击提交按钮......
    • 想出了一些接近我需要的东西。它现在在原始问题的编辑中。感谢您帮助解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多