使用form_remote_tag提交不触发适当的接受标头

时间:2009-12-19 04:28:57

标签: ruby-on-rails ajax

form_remote_tag似乎生成了正确的html,但是format.html被渲染而不是format.js。 format.html被渲染而不是format.js的两个最常见的答案是将文件*。rjs重命名为*。js.rjs并确保实际加载了javascript文件。这两项都已完成。如果我能提供任何其他信息,请告诉我。

[编辑] create.js.rjs已在下面添加。 [/编辑]

Rails 2.3.2

视图/项目/ show.html.erb

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

milestones_controller.rb

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

生成了html

<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>

create.js.rjs

page.insert_html :bottom, 'milestone_list', "Hi"

5 个答案:

答案 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)结尾?