0

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

<%= 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)

我怎样才能知道输出被渲染到哪里,以便我可以弄清楚为什么我没有在用户单击“New Cat”按钮的同一个窗口中看到它?

4

1 回答 1

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;

请注意,这种方法会使用以下方法排除:

<%= 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 中包含有关浏览器页面上的哪些元素受到影响的说明。

例如,您可以这样做:

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

或这个:

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

每一个都会影响页面上的不同元素。

于 2012-11-05T18:26:50.703 回答