感谢您阅读这篇文章。过去几天我一直被 RoR 的问题困扰。我在index.html.erb下有一个表格:
<head>
<title>Ajax List Demo</title>
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
</head>
<body>
<h3>Add to list using Ajax</h3>
<% form_tag :action => :list , :method=>:get, :remote=>true do %>
Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
<%= submit_tag "Find" %>
<% end %>
<div id="my_list">
</div>
</body>
在控制器中我有:
def list
puts "here!!!!"
reader = Reader.new
@profiles = reader.processURL(params[:url]) #profileList =
respond_to do |format|
#format.html { render :partial=>true, :locals => { :profiles => @profiles}}#{ render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}}
format.js {render :content_type => 'text/javascript', :locals => { :profiles => @profiles}}
# index.html.erb
# format.rss render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}
end
远程 UJS 的 js 文件为 list.js.erb
$("#my_list").html("<%= escape_javascript(render(:partial => "list"))%>");
问题是我无法获得在 div 标签 my_list 中渲染部分 _list.html.erb 的结果。我收到一个空白页,406 错误。如果我取消注释控制器中的渲染 html 代码,我会在浏览器中得到渲染的部分内容。我有点卡住了,我想提交表单并将结果弹出到 my_list div 中。我是 Rails 新手,所以如果我遗漏了一些明显的东西,请毫不犹豫地向我指出......我绝对愿意尝试。
改成这样:
<html>
<head>
<title>Ajax List Demo</title>
<h1>Listing posts</h1>
<%= javascript_include_tag 'jquery.js' %>
<%= csrf_meta_tag %>
</head>
<body>
<h3>Add to list using Ajax</h3>
<% form_tag :action => :doit , :method=>:get, :remote=>true do %>
Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
<%= submit_tag "Find" %>
<% end %>
<div id="my_list">
</div>
控制器:
def doit
puts "here!!!!"
reader = Reader.new
@profiles = reader.processURL(params[:url])
respond_to do |format|
# format.html {render :partial=>true, :locals => { :profiles => @profiles}}#{ render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}}
format.js #{render :content_type => 'text/javascript', :locals => { :profiles => @profiles}}
# index.html.erb
# format.rss render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}
end
JS
_doit.js.erb
$("#my_list").html(" "doit"))%>");
最后是部分:
_doit.html.erb。
但是我仍然收到 406 错误,我没有重复的 _doit js 或 erb。有什么明显不正确的地方吗?再次感谢!
另一个更新:
我认为表单渲染不正确:
这呈现:
<% form_tag :action => :doit , :remote=>true, :id => 'myform' do %>
Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
<%= submit_tag "Find" %>
<% end %>
This:
<form accept-charset="UTF-8" action="/home/doit?id=myform&remote=true" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="MLuau4hvfdGO6FrYCzE0c0JzwHhHKZqjmV49U673sK8=" />
</div> Enter the public url:
<input id="url" name="url" size="80" type="text" value="" />
<input name="commit" type="submit" value="Find" />
<input name="commit" type="submit" value="Find" />
它将我的远程标记和 id 添加到查询字符串中,这不是错误的吗?
好吧,终于得到了线索,表格需要用括号括起来:
<%= form_tag( { :action => 'doit' }, :multipart => true, :remote=>true, :id => 'myform' ) do %>
好的,今晚最后更新:
现在我进入日志:
于 2010 年 10 月 27 日星期三 22:40:55 -0400 开始对 127.0.0.1 发布“/home/doit”
这里!!!!
由 HomeController#doit 作为 JS 处理
参数:{“commit”=>“查找”,“url”=>“http://www.facebook.com/people/James-Stewart/653161299”,“authenticity_token”=>“MLuau4hvf
dGO6FrYCzE0c0JzwHhHKZqjmV49U673sK8=", "utf8"=>"Г°"}
渲染 home/_doit.html.erb (4.0ms)
渲染 home/doit.js.erb (9.0ms)
在 807 毫秒内完成 200 OK(查看次数:40.0 毫秒 | ActiveRecord:0.0 毫秒)
我看到 as JS,它说它渲染了我的 js/partial。但是我在 my_list div 上什么也没有得到。我的JS文件:
$("#my_list").html("<%= escape_javascript(render(:partial => "doit"))%>");
我的 html.erb 表单文件现在有:
<script$('#myform').bind('ajax:success', function(evt, data, status, xhr){
xhr.responseText;
});></script>
就像表单什么也没做一样,这是一个好兆头,不再有 406 错误。我知道这已经很接近了,如果有人能指出我需要在 js 中做什么,那就太好了,否则我会休息一下并尝试 tmrw。
好吧,我认为它得到了回应,只是没有像你指出的那样渲染,这是昨天史蒂夫的问题。
在 Firebug 上调试 JS 我看到了我想要在 div 中呈现的 html,为此:
http://localhost:3000/javascripts/prototype.js?1285674435/event/seq/1
这意味着我想我现在收到了 JS 响应。
我在表单页面上有这个:
<script>$('#myform').bind('ajax:success', function(evt, data, status, xhr){
$('#my_list').html(eval(xhr.responseText));
});</script>
检查表明它不知道 myform 是什么,但我在 Rails 代码中放入了 :id => 'myform' 。
再次感谢,我在这里得到了很多帮助,我想分享我如何最终让它回到社区。
doit 方法的 js 文件(默认需要一个更好的控制器操作名称)是 doit.js
代码最终是:
$("my_list").update("<%= escape_javascript(render(:partial => "doit"))%>");
由于某种原因,在 Firefox 中找不到#my_list,我不得不使用 Firebug 来最终解决这个问题。
显然这与下面建议的方式不同,我将把 js 脚本放回表单中并删除 .js.erb 文件,看看它是如何工作的。我想我只是在 format.js 响应中渲染部分内容?另外大家在哪里可以找到有关编写 UJS 文件的信息?我对以 $ 开头的任何内容的语法一无所知。
再次感谢您的帮助,终于感觉我在学习 Rails 方面取得了进展。