rails response_to究竟如何工作?

时间:2013-04-02 16:01:59

标签: javascript ruby-on-rails ajax

我目前正在构建一个需要远程表单的应用程序,而且我发现我从未真正理解rails respond_to是如何工作的。

例如,我在视图中有以下代码

<%= form_tag ..., :remote => true %>
<%= submit_tag "submit" %>
<% end %>

我有一个部分命名为_home.js.erb的javascript,假设相关操作名为home

我知道如果我的控制器中有以下代码:

def home
    # ...
    respond_to do |format|
        format.html
        format.js { render :partial => 'home' }
    end
end

当按下表单的提交按钮时,这将在_home.js.erb中执行javascript。但是,按下提交按钮时到底发生了什么? rails如何知道是respond_to html还是javascript?

非常感谢!

3 个答案:

答案 0 :(得分:1)

如果标题指示其类型为

,则Responder对象会呈现内容
  • HTML
  • JS​​

否则,调用一个调用object.method的魔术方法,该方法是响应类型的名称(例如csv

这要求将此方法定义为响应类型的处理程序。 A good discussion of how to create custom responders was answered here

答案 1 :(得分:0)

提交按钮会在表单中发布某些标题/ mime设置。 respond_to决定了如何根据请求的内容类型,动词和资源状态采取行动。

详情请见此处:ActionController::Responder < Object

答案 2 :(得分:0)

在选项哈希中,remote: true正在请求Rails使用javascript进行响应。

如果您有网络检查员,请检查网络标签,提交表单,您可以在http请求标头中看到帖子请求在接受字段中请求javascript。如果您在选项哈希中没有远程标记,则表单提交将请求html。

此外,如果您在项目目录中执行rake路由,您将看到几乎每个路径都以。:format关键字/posts(.:format)结尾,允许您的控制器响应用户可以使用的多种格式可能在特定控制器中定义。