繁体   English   中英

我不了解此Rails模板渲染的行为

[英]I don't understand the behaviour of this Rails template rendering

我有这个控制器:

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框架。 ideally应将myform div替换为从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提交表单。

您可以返回html更新:

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

然后更新元素客户端。

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

或者,为防止动态添加html出现问题,请使用jquery的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' }") %>'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM