Rails respond_with:它是如何工作的?

2024-04-18

我到处读到关于它有多酷的内容respond_with方法在 Rails 3 中。但我什至无法在 Rails API 中或通过搜索源代码找到对它的引用。任何人都可以向我解释它是如何工作的(您可以使用哪些选项等),或者向我指出它实际实现的位置,以便我可以自己仔细阅读代码?


Rails 4.2+ 更新

#respond_with and ::respond_to (n.b.类方法)是不再是 Rails 的一部分。他们被迁移到第三方响应者 https://github.com/plataformatec/responders从 Rails 4.2 开始的 gem (发行说明 http://guides.rubyonrails.org/4_2_release_notes.html#respond-with-class-level-respond-to / commit https://github.com/rails/rails/commit/ee77770d57de9da87b05a2fe84b9d46ec6852c62#diff-bb9b4c4885f0fec7dd7766455423d401日期为 2014 年 8 月)。虽然默认情况下,Rails 中不包含响应程序,但它是 Devise 的依赖项,因此可在许多 Rails 应用程序中使用。

The #respond_to 实例方法,然而,是仍然是 Rails 的一部分(截至撰写本文时为 5.2rc1)。

官方 Rails API 文档ActionController::MimeResponds http://edgeapi.rubyonrails.org/classes/ActionController/MimeResponds.html解释如何#respond_to作品。原始 Rails Guides 文档注释#respond_with and ::respond_to仍然可以找到响应者宝石源代码 https://github.com/plataformatec/responders/blob/master/lib/action_controller/respond_with.rb.


原答案

响应者的代码基于类和模块。哑剧回应 https://github.com/rails/rails/blob/v3.2.12/actionpack/lib/action_controller/metal/mime_responds.rb包含在动作控制器::基础 https://github.com/rails/rails/blob/v3.2.12/actionpack/lib/action_controller/base.rb#L196,你的班级ApplicationController继承自.然后有动作控制器::响应者 https://github.com/rails/rails/blob/v3.2.12/actionpack/lib/action_controller/metal/responder.rb它提供了使用 respond_with 时的默认行为。


默认情况下,rails 在响应中提供的唯一行为是隐式尝试渲染名称与操作匹配的模板。除此之外的任何操作都需要操作中的更多指令,或者使用块来调用自定义的 respond_to 来处理多种格式响应。

由于大多数控制器使用相当常见的自定义模式,因此响应程序通过引入更多默认行为来提供额外的抽象级别。读取针对特定格式调用 to_xml/to_json 的操作,以及提供相同格式的突变操作以及成功突变操作的重定向。


有一些机会可以定制响应者的行为方式,从细微的调整到完全覆盖或扩展行为。

班级级别:respond_to

您可以在此处指定响应程序应处理的格式。可以自定义格式以决定它们将应用于哪些操作。每种格式都可以通过单独的调用来指定,从而允许完全自定义每种格式的操作。

# Responds to html and json on all actions
respond_to :html, :json

# Responds to html and json on index and show actions only.
respond_to :html, :json, :only => [:index,:show]

# Responds to html for everything except show, and json only for index, create and update
respond_to :html, :except => [:show]
respond_to :json, :only => [:index, :create, :update]

班级级别:responder

这是保存响应者的类属性。这可以是响应调用的任何内容,这意味着您可以使用 proc/lambda 或响应调用的类。另一种选择是将一个或多个模块混合到现有响应程序中以重载现有方法,从而增强默认行为。

class SomeController < ApplicationController
  respond_to :json

  self.responder = proc do |controller, resources, options|
    resource = resources.last
    request = controller.request
    if request.get?
      controller.render json: resource
    elsif request.post? or request.put?
      if resource.errors.any?
        render json: {:status => 'failed', :errors => resource.errors}
      else
        render json: {:status => 'created', :object => resource}
      end
    end
  end
end

虽然可能存在一些有趣的边缘用例,但将模块扩展或混合到默认响应程序中更有可能是更常见的模式。无论如何,相关的选项是资源和选项,因为它们是从respond_with 传递过来的。

实例级别:respond_with

这里的选项是那些将传递给控制器​​中的 render 或 redirect_to 的选项,但它们仅包含在成功场景中。对于 GET 操作,这些将是渲染调用,对于其他操作,这将是重定向选项。其中最有用的可能是:location选项,可用于覆盖该重定向路径,以防 respond_with 的参数不足以构建正确的 URL。

# These two are essentially equal
respond_with(:admin, @user, @post)
respond_with(@post, :location => admin_user_post(@user, @post)

# Respond with a 201 instead of a 200 HTTP status code, and also
# redirect to the collection path instead of the resource path
respond_with(@post, :status => :created, :location => posts_path)

# Note that if you want to pass a URL with a query string
# then the location option would be needed.
# /users?scope=active
respond_with(@user, :location => users_path(:scope => 'active'))

作为替代方案,响应者 https://github.com/plataformatec/respondersgem 不仅提供了一些用于覆盖某些默认行为的模块。它使用扩展默认响应程序的匿名类覆盖默认响应程序,并提供类级别方法以将自定义模块混合到此类中。这里最有用的是 flash 响应器,它提供了一组默认的 flash,将自定义委托给 I18n 系统,config/locales/en.yml默认情况下。

我在以前的项目中使用的自定义响应程序的一些示例包括自动装饰我的资源的响应程序,并提供一组默认的页面标题和一个用于轻松自定义或覆盖页面标题的界面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails respond_with:它是如何工作的? 的相关文章

  • 在虾中使用列表

    我使用 prawn 创建 pdf 文件 其中包含大量表格格式的数据和一些列表 列表的问题在于 我只是使用文本作为列表 因为没有与 ul gt li 列表等效的语义 就像我在 webfrointend 中使用它们一样 所以这些清单是不合理的
  • 来自插件的 Rails 3 控制器

    我正在创建一个 Rails 3 插件 我想在其中集成控制器 rails 将自动将其视为 app controllers 文件夹中的 普通 控制器 我该如何做到这一点 或者从插件获得自定义控制器的最佳解决方案是什么 我找到了文档指南 ruby
  • counter_cache 可以与 has_many 一起使用吗?

    我正在努力将 counter cache 添加到我的模型中 用户 id org id 组织 id users count 但出现以下错误 ArgumentError Unknown key s counter cache class Org
  • 如何将 image_tag 与 bootstrap class: "img-responsive" 一起使用?第11章

    我问这个问题的原因是为了解决一个非常烦人的语法错误 我正在使用第 11 章 这样我就可以在我的新网站上使用图像构建一个博客部分 除了我尝试向此行添加 class img responsive 之外 一切都正常 我只是无法弄清楚添加类的正确语
  • Rails cron 每当捆绑:命令未找到

    我尝试使用 每当 每天执行一次耙子任务 我收到这个错误 bin bash bundle command not found home app rvm rubies ruby 1 9 2 p180 lib ruby site ruby 1 9
  • Heroku dyno/worker 在开始时崩溃

    我有一个用 Rails 编写的应用程序 部署在 Heroku 上 我以前一直在开发1个web dyno 但是今天我发布了应用程序 流量相当大 所以我决定增加到4个web dyno和1个worker dyno 我不知道为什么当我这样做时总是h
  • 如何在使用代理服务器访问 Internet 的 Windows 计算机上安装 Rails?

    我是 ruby 方式的忠实粉丝 然而今天它妨碍了我 安装rails的事实上的方法 我在WinXP机器上以域用户身份运行 是 下载并安装 ruby 一键安装程序 type gt gem install rails在命令提示符下 步骤 2 失败
  • Friendly_id 和真实ID

    有什么办法可以得到真正的id使用Friendly id 修改的模型中的列 出于性能原因 我不想对其进行另一个数据库查询 广义上来说Friendly id修改to param and find方法 接下来应该可以工作 affiche Affi
  • Rails 3 - 使用 Ajax 和 jquery 更新 div 内容(嵌套资源)

    我有两个简单的模型 Pin 和 Comment Comments 属于 Pin class Pin lt ActiveRecord Base has many comments dependent destroy and class Com
  • 覆盖生产环境中的后端资产

    我正在开发一个需要稍微改变 Refinery 的 WYMEditor 行为的项目 这可以通过重写轻松完成jquery refinery wymeditor js using rake refinery override并根据我自己的需要进行
  • 安装heroku toolbelt后出现Ruby错误

    我正在 win 7 32 位系统上使用 Heroku 但我没有管理员权限 我已经下载并安装了heroku工具带如下http community webfaction com questions 11803 heroku toolbelt h
  • Rails 3,i18n:将 html 标签插入文本

    我的问题正是中描述的问题这个问题 https stackoverflow com questions 2543936 rails i18n translating text with links inside 唯一的区别 我使用的是 Rai
  • 如何在 Rails 应用程序中选择性地跟踪方法及其文件访问?

    对于 Rails 应用程序 我想重载或修改 Kernel load 以便它打印出完整路径 例如puts gt File expand path File dirname FILE File basename FILE 对于加载的每个 Rai
  • 使用 Figaro 和 Secrets.yml 管理环境变量

    我有一个 Rails 4 1 应用程序 我正在尝试组织我的环境变量 截至目前 我的 config 文件夹中有一个 Secrets yml 文件 我还安装了费加罗宝石 我的目标是将所有环境变量放在 application yml 未签入 gi
  • 如何防止Rails“复数”列名?

    我正在使用 dwilkie 的外国人 http github com dwilkie foreignerRails 插件 我有一个表创建语句 如下所示 create table agents games force gt true id g
  • 如何在 jQuery.ui.autocomplete 中的自动完成弹出窗口下方添加所有搜索的链接?

    我有使用 jQuery UI 自动完成插件的搜索建议自动完成功能 http jqueryui com autocomplete http jqueryui com autocomplete 但是如何添加结果弹出项目的底部 其行为类似于 Qu
  • 我可以使用 ActiveRecord 与 Hstore 中的字段的关系吗?

    我可以使用 hstore 哈希中的字段通过活动记录 own to 将一个模型与另一个模型绑定吗 我将详细说明 我有一个用户模型 它根据权限通过 STI 在其字段之一上子类化为许多不同的其他用户模型 class User lt ActiveR
  • 导轨、定制探测器

    所以我希望能够使用来获取一个对象find by id or name 我觉得我看到了另一个这样的问题 但很难找到任何资源来制作我自己的查找器 您可以通过向模型添加类方法来做到这一点 例如 class Model lt ActiveRecor
  • ActiveRecord 和关联排序

    我有一个像这样的简单 AR 关联 Question has many answers Answer belongs to question with question id int 11 NOT NULL is accepted tinyi
  • 安装适用于 Windows 7 的 Ruby on Rails(最新)

    我是一名设计师 而不是一名编码员 并且在首次安装时遇到了问题 我下载了 Rails 1 8 6 和 Instant Rails 我打开控制台并尝试更新 gem 那里没有任何作用 我想我会删除所有内容并重新开始 因为我确信我现在破坏了某些东西

随机推荐

  • 添加渐变背景色和描边 - CSS

    我已将背景渐变添加到其中一个 css 类中 但它从笔画中获取颜色 有没有办法使边框渐变 flex wrapper display flex flex flow row nowrap single chart margin left 160p
  • 调试变量不适用于 gulp sourcemaps + uglify

    我有以下用于捆绑 javascript 的 gulp 任务 gulp task js function return gulp src paths js pipe sourcemaps init pipe uglify pipe conca
  • 在 MATLAB 中调整 3D 矩阵(图像)的大小

    我有一个 3D 矩阵 MxNxK 想将其大小调整为 M xN xK 就像 matlab 中的 imresize 一样 我正在使用图像金字塔 但其结果不是很准确 需要一个更好的 有什么解决办法吗 你可以使用interp3 因为您想要插入 3D
  • 从 Dataflow 写入 BigQuery - 作业完成时不会删除 JSON 文件

    我们的 Dataflow 作业之一将其输出写入 BigQuery 我对其幕后实现方式的理解是 Dataflow 实际上将 JSON 格式的结果 分片 写入 GCS 然后启动 BigQuery 加载作业以导入该数据 但是 我们注意到 无论作业
  • CSS 中的鼠标按下选择器是什么?

    我注意到按钮和其他元素具有默认样式 并按 3 个步骤运行 普通视图 悬停 焦点视图和鼠标按下 单击视图 在 CSS 中我可以更改普通视图和悬停视图的样式 如下所示 button background 333 color FFF button
  • ngResource 将 POST 参数附加到 url

    我有一个看起来像这样的角度服务 我在这里发出 POST 请求 factory Apples function resource HOST return resource HOST apples create method POST para
  • 使用 XPath 排序 - 不是 XSL

    XPath DOM 编程中有什么方法可以使用System Xml to run selectNodes XPATH 带有排序参数 例如 对于以下 XML 程序按照与文档相同的顺序 降序 写入值 有没有办法使用 XPath 来按升序获取值 笔
  • 是否可以使用计时器为 JButton 创建淡入效果?

    我想在我的程序按钮上添加一些效果 当我按下button the button应该淡入 Using a timer改变的值Opaque in new Color 是一种方式 但是可以应用于JButton还有 因为JButton有边界 所以我想
  • 分配后列表被意外清除[重复]

    这个问题在这里已经有答案了 class ListHolder public List
  • 应用程序中所有国家/地区的城市和邮政编码

    有没有一种方法可以将所有国家 州 城市的邮政编码存储在一个数据库中 我一直在到处寻找 我发现地名网 http www geonames org 我猜其中包含了所有内容 但无法直接获取该数据 我正在使用导轨 如果有任何助手或插件就太好了 如果
  • 更改 iOS 中的应用程序语言设置而不是整个设备

    我希望在我的应用程序中可以选择更改我的应用程序语言 只是应用程序语言而不是整个系统 请给我一些提示好吗 提前致谢 我知道本地化 您可以使用从 Xcode 设置的自定义构建标志来完成此操作 这样您就可以在本地化下运行应用程序 而无需更改设备的
  • 当我单击数据表中的下一页时,我的 jquery 选择器不再工作

    我在用着数据表 http www datatables net jquery 插件在页面上显示我的数据 当有人单击一行时 我有这个选择器 myTable tr class tableHeader click function alert c
  • 多线程程序中的 std::string

    鉴于 1 C 03标准没有以任何方式解决线程的存在 2 C 03 标准将其留给实现来决定是否std string应该在其复制构造函数中使用 Copy on Write 语义 3 写时复制语义通常会导致多线程程序中不可预测的行为 我得出以下看
  • 为什么要使用Promise.resolve().then()?

    在阅读 Angular 指令的代码时路由器链路激活 https github com angular angular blob master packages router src directives router link active
  • 释放 GCD 调度队列属性的正确方法是什么?

    我正在使用一个dispatch queue 它是通过其所有者的属性访问的 如下所示 property nonatomic assign dispatch queue t queue 请注意assign关键词 队列在对象的整个生命周期中使用
  • 嵌套属性未以简单形式显示

    鉴于以下情况 Models class Location lt ActiveRecord Base has many games end class Game lt ActiveRecord Base validates presence
  • 如何获取 BTreeSet 中元素的下界和上限?

    正在阅读BTreeSet文档 我似乎无法弄清楚如何从 a 中获取大于元素的最小值或小于元素的最大值BTreeSet在对数时间内 我看到有一个range https doc rust lang org std collections stru
  • 将 Elmah 与 WebApi 结合使用时,错误会记录两次

    我正在尝试使用 elmah 记录我的 asp net web api 项目中的异常 我遇到的问题是每个错误都会记录两次 我正在使用 Elmah Contrib Web Api 我的应用程序类如下 public class WebApiApp
  • 用 R 计算年龄

    我在 R 中有两个数据帧 其中一个数据帧包含一个人的出生年份 YEAR 1931 1924 然后另一列显示最近的时间 RECENT 09 08 2005 11 08 2005 我想做的是减去年份 以便我可以计算他们的年龄 但我不知道如何处理
  • Rails respond_with:它是如何工作的?

    我到处读到关于它有多酷的内容respond with方法在 Rails 3 中 但我什至无法在 Rails API 中或通过搜索源代码找到对它的引用 任何人都可以向我解释它是如何工作的 您可以使用哪些选项等 或者向我指出它实际实现的位置 以