【发布时间】:2011-04-30 13:00:12
【问题描述】:
感谢您阅读这篇文章。在过去的几天里,我一直被困在 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 %>
这个:
<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,这不是错了吗?
Ok 终于知道表格需要用括号括起来了:
<%= 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 as JS 处理 参数:{"commit"=>"Find", "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 毫秒)
我看到的是 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"))%>");
由于某种原因,将其保留为 #my_list 在 Firefox 中找不到,我不得不使用 firebug 来最终解决这个问题。
显然这与下面建议的方式不同,我将把 js 脚本放回表单中并删除 .js.erb 文件,看看它是如何工作的。我想我只是在 format.js 响应中呈现部分内容?另外,每个人都在哪里找到有关编写 UJS 文件的信息?我对以 $ 开头的任何东西的语法一无所知。
再次感谢您的帮助,终于觉得我在学习轨道上取得了进步。
【问题讨论】:
标签: ruby-on-rails ajax ruby-on-rails-3