我有一个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)
如何判断输出的呈现位置,以便我可以弄清楚为什么在用户点击“新猫”按钮的同一窗口中看不到它?
答案 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>')";
每个都会影响您网页上的不同元素。