Rails 3: невозможно получить форму для обработки как JavaScript вместо HTML - PullRequest
4 голосов
/ 12 мая 2011

Я пытаюсь обработать форму из представления в контроллере, но тип данных всегда отправляется как 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();
             });
        });
});

1 Ответ

3 голосов
/ 12 мая 2011

Возможно, я упускаю суть, но как вы справляетесь с отправкой формы?

Если вы присоединяете событие к своей странице для обработки отправки первой формы, вам нужно будет re - присоединить событие к вновь созданной форме, то есть после того, как вы отправили ее, первый раз.

Посмотрите на jQuery live как способ, которым вы могли бы справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...