调试渲染JS输出的位置

时间:2012-11-05 15:35:52

标签: javascript ruby-on-rails-3 twitter-bootstrap

我有一个Rails 3应用程序在link_to上使用不显眼的Javascript,创建一个需要用户输入的小窗口。这是原始按钮(当客户添加Cat时):

<%= link_to "New Cat", new_client_cat_path(@client), :remote => true, :class => "btn btn-primary btn-large" %>

在app / controllers / cats_controller.rb中:

def new
  @cat = @client.cats.build
  @submit_label = "Create"
  respond_to do |format|
    format.html
    format.js { }
  end
end

在app / views / cats / new.js.erb中:

$('#<%= dom_id(@cat) %> .details').html('<%= escape_javascript render("new") %>');

在app / views / cats / _new.html.erb中:

<h2>New Cat</h2>
<%= form_for [@client, @cat] do |f| %>
<%= f.error_messages %>
<%= f.submit @submit_label, :class => "btn btn-primary btn-large" %>
<% end %>
<%= link_to "Cancel", @client, :class => "btn btn-primary btn-large" %>

我的问题是我没有看到渲染的“新”窗口。日志文件显示这些页面已呈现:

Rendered cats/_new.html.erb (3.8ms)
Rendered cats/new.js.erb (5.4ms)

如何判断输出的呈现位置,以便我可以弄清楚为什么在用户点击“新猫”按钮的同一窗口中看不到它?

1 个答案:

答案 0 :(得分:0)

您正在返回渲染(“新”)。相反,你可能想要渲染部分。因此,从新视图中提取实际的表单定义,并将它们放在部分“_new.html.erb”

所以你的new.html.erb会包含

<%= render :partial=>'new' %>

和你的new.js.erb:

$('#<%= dom_id(@cat) %> .details').html('<%= escape_javascript render(:partial=>"new") %>');

我仍然不确定这完全解决了你想要做的事情,但它应该让你朝着正确的方向前进。例如,您将返回的HTML放入哪个元素?它必须是由现有form_for包围的元素。你可以这样做:

<%= form_tag  '/thing/create',  :html=>{:style=>'display:none'} do %>
  <div id='newform'>
    <%= render(:partial=>'new') %>
  </div>
<% end %>

然后:

$('#newform').html('<%= escape_javascript render(:partial=>"new") %>');
$('#newform').show;

请注意这种方法PRECLUDES使用它:

<%= form_for @resource  do |f| %>
  <% f.text_field :foo %>
<% end %>

您无法将封闭的f块发送到控制器并让控制器操作尝试并在部分中处理它:

<%= f.text_field :foo %>

所以你必须诉诸:

<%= form_tag .... do %>
  <%= render_partial=>'new' %>
<% end %>

和_new.html.erb

<%= text_field_tag , 'thing[foo]', @thing.foo %> 

当控制器响应AJAX请求时,发送回HTML,它一般被定向到浏览器,包含在HTML中,是关于broswer页面上哪些元素受到影响的说明。

例如,你可以这样做:

render :js=>"$('#foobar').html('<h1>TITLE</h1><p>foobar</p>')";

或者这个:

render :js=>"$('#barfoo').html('<h1>TITLE</h1><p>barfoo</p>')";

每个都会影响您网页上的不同元素。