Я не понимаю поведение рендеринга шаблона Rails - PullRequest
0 голосов
/ 19 марта 2011

У меня есть этот контроллер:

class FormCreatorController
  def build_form
    if param[:ftype] == 2
       @partial_file = "extra"
    else
       @partial_file = "basic"
    end
    respond_to do |format|
      format.js
    end
  end
end

Это вызывается из new представления, где код выглядит так:

<div class="column span-16 last">

    <%= form_tag build_form_ads_path,:method => :get,:remote => true,:id => "ad_builder_form" do %>

        <div class="column span-4">
            <strong>Form type</strong>
        </div>

        <div class="column span-12 last">
            <%= select_tag(:ad_type,options_for_select(@ad_types_mapped)) %>
        </div>
    <% end %>



    <div class="column span-16 last" id="myform">
        Please select an option
    </div>

</div>

Я использую jQuery в качестве своего ajax-фреймворка. myform div, ideally следует заменить содержимым того, что возвращается из build_form. У меня есть это в build_form.js.erb:

$('#myform').html($('<%= render :partial => @partial_file %>'))

Моя основная форма содержит это:

<h1>Basic</h1>

Моя extra форма содержит это:

<h2>Extra</h2>

Но, когда сделан запрос XHR, с моим div ничего не происходит. Если, однако, я поставлю это в свои частичные:

$('#myform').html("<h1>Basic</h1>")

и

$("#myform").html("<h1>Car</h1>");

тогда они правильно отображаются на странице. Создание пользовательских форм с использованием конкатенации строк JavaScript является утомительным, но выполнимым. Я уверен, что есть лучший способ сделать вещи. Что я должен сделать, чтобы код из моих партиалов корректно отображался вместо моего div?

РЕДАКТИРОВАТЬ: возможно, это помогает. Это содержимое моего application.js:

$().ready(function() {
    jQuery.ajaxSetup({ 
        'beforeSend': function(xhr) {
            xhr.setRequestHeader("Accept", "text/javascript");
        }
    });

    $("#ad_type").change(function() {
        $("#ad_builder_form").submit();
    });
});

Каждый раз, когда изменяется значение select, я отправляю форму с помощью jQuery.

1 Ответ

1 голос
/ 19 марта 2011

Вы можете вернуть обновление html:

'<%= escape_javascript(render "#{param[:ftype].eql?(2) ? 'extra' : 'basic' }") %>'

, а затем обновить клиентскую часть элемента.

$("#ad_type").change(function() {
    $("#ad_builder_form").submit(function(){
     $('myform').html(this);
     });
});

или, чтобы предотвратить проблемы с динамически добавленным html, используйте jquery's live:

$('#ad_type').live('change', function() {
    action = $('#ad_builder_form').attr('action');
    $.post(action, jQuery.param(jQuery($('#ad_builder_form')).serializeArray()), function(data) {},
    'script');
    return false;
});

затем верните скрипт из вашего приложения, как и раньше:

$('#myform').html('<%= escape_javascript(render "#{param[:ftype].eql?(2) ? 'extra' : 'basic' }") %>'))
...