form_remote_tag
似乎生成了正确的html,但是format.html被渲染而不是format.js。 format.html被渲染而不是format.js的两个最常见的答案是将文件*
。rjs重命名为*
。js.rjs并确保实际加载了javascript文件。这两项都已完成。如果我能提供任何其他信息,请告诉我。
[编辑] create.js.rjs已在下面添加。 [/编辑]
Rails 2.3.2
<%= form_remote_tag :url => { :controller => :milestones, :action => :create }
#:update => 'milestone-list',
#:url => { :controller => "milestones", :action => :ajax_create},
#:position => 'bottom'
%>
<%= render :partial => 'milestones/form' %>
<input type="hidden" id="milestone_project_id" name="milestone[project_id]" value="<%=@project.id %>" />
<%= submit_tag 'Add Milestone' %>
def create
@milestone = Milestone.new(params[:milestone])
respond_to do |format|
if @milestone.save
flash[:notice] = 'Milestone was successfully created.'
format.js {render :layout => false }
format.html { render :show }#redirect_to(@milestone) }
format.xml { render :xml => @milestone, :status => :created, :location => @milestone }
else
format.html { render :action => "new" }
format.xml { render :xml => @milestone.errors, :status => :unprocessable_entity }
end
end
end
(域名和ips已更改。服务器是mongrel,apache设置为代理)
* ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
* HOST: 127.0.0.1:8004
* X_FORWARDED_HOST: slate.project.mydevserver.com
* VIA: 1.1 project.mydevserver.com
* USER_AGENT: Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
* ACCEPT_LANGUAGE: en-us,en;q=0.5
* REFERER: http://slate.project.mydevserver.com/projects/2
* VERSION: HTTP/1.1
* X_FORWARDED_SERVER: project.mydevserver.com
* X_FORWARDED_FOR: 1.2.3.4
* ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.7
* CONNECTION: Keep-Alive
* ACCEPT_ENCODING: gzip,deflate
<form action="/milestones" method="post" onsubmit="new Ajax.Request('/milestones', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;">
<div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="wTS9QPqFiGvP3RVlvKsA49Z6xtEGH9gmcLP//XC0whc=" /></div>
Title: <input id="milestone_title" name="milestone[title]" size="30" type="text" /><br />
Description: <input id="milestone_description" name="milestone[description]" size="30" type="text" /><br />
Days: <input id="milestone_days" name="milestone[days]" size="30" type="text" /><br />
<input type="hidden" id="milestone_project_id" name="milestone[project_id]" value="2" />
<input name="commit" type="submit" value="Add Milestone" />
</form>
page.insert_html :bottom, 'milestone_list', "Hi"
答案 0 :(得分:0)
您在测试的浏览器中是否有禁用Javascript的机会?这可以解释你的结果。
答案 1 :(得分:0)
您是否尝试从{render :layout => false }
删除format.js
块,并执行类似
...
...
format.js
format.html { render :show }#redirect_to(@milestone) }
...
根据我的理解,RJS不处理布局,因为它不会在其中产生,但我可能错了。但我个人之前从未在我的js响应中实际使用过:layout选项。
此外,您的渲染调用缺少“要渲染的内容”。像...
render :js => "alert('this is javascript')"
render :action => "some_action"
render :xml => ....
答案 2 :(得分:0)
您可以通过强制格式为javascript并添加以下内容来轻松检查您的代码是否正常:format =&gt; :js到url哈希。它会明确地将格式添加到url中,从而强制渲染javascript,但它会破坏javascript禁用浏览器的优雅降级。如果你想保留这个功能 - 我相信你应该查看你的代理(apache)配置,就像上面所说的那样 - 显然它正在弄乱你的标题。
尝试在浏览器发送请求时(使用Firebug或LiveHTTPHeaders for Firefox)捕获请求,并将其与您在服务器端看到的请求进行比较,我相信您会发现存在问题。
答案 3 :(得分:0)
一个想法是,您可以在控制器中重写您的创建操作,以包含测试以查看请求是否为XHR(文档中为detailed further),这是一个简化版本:
def create
@milestone = Milestone.new(params[:milestone])
if @milestone.save
if request.xhr?
render :update do |page|
page.insert_html :bottom, 'milestone_list', "Hi"
end
else
respond_to do |format|
flash[:notice] = "Milestone saved"
format.html
end
end
else
respond_to do |format|
flash[:error] = "There was a problem saving the milestone"
format.html { render :action => :new }
end
end
end
这可能会让一些人感到害怕,但你应该明白这一点。
答案 4 :(得分:0)
如果您运行rake:routes
,您使用的路线是否以(.:format)
结尾?