【问题标题】:respond_to with custom format aliasing json format, is this possible?respond_to 自定义格式别名 json 格式,这可能吗?
【发布时间】:2011-12-11 18:37:44
【问题描述】:

我有一种情况,我将 json 对象返回到我的应用程序,这些对象是从 YML 文件构建的。因为要解析 yml 文件并将其作为 json 返回,我总是必须这样做:

format.json { render json: YAML.load(render_to_string :file => File.join(Rails.root,'app','views','home','icons.yml.erb'), :layout => false ) }

我想通过创建自定义格式(但是)生成 json 来缩短此操作,因此我不想创建新的 mime 类型。

我的想法是写:

format.myformat

它会在views/mycontroller目录中自动搜索myaction.myformat.erb,并自动解析yaml文件,将其作为json对象返回。

这可能吗?如果是,我最终该怎么做?

编辑 1: 我在 config/mime_types.rb 中找到了一个重要的建议:

Mime::Type.register_alias "text/html", :iphone

所以我可以为 mime 类型设置别名,现在最大的问题是:如何定义给定格式的默认渲染操作,就像 format.html 那样?

如果我写

format.html

current_action.html.erb 会自动渲染,如何选择正确的方法渲染自定义格式?

编辑 2:

我设法创建了这段代码(在控制器内部,通过我构建的一些辅助方法):

  def icons
    respond_to do |format|
      format.extjson { render_to_extjson }
    end
  end

如果我写的话,是否可以让 Rails 明白:

  def icons
    respond_to do |format|
      format.extjson
    end
  end

必须这样做:

format.extjson { render_to_extjson }

默认?

【问题讨论】:

  • 你真的尝试过按照你在Edit2中所说的去做吗?如果你这样做了,你得到了什么错误?
  • 它只是通过评估所有 erb 事物来呈现它,并将文档作为字符串返回,而不像 render_to_extjson 那样进行 YAML 解析。
  • 你考虑过使用 Rails 3 自定义响应器吗?查看asciicasts.com/episodes/224-controllers-in-rails-3的最底部
  • 我喜欢这个建议,但仍然没有按照我的要求去做。我正在考虑为渲染方法设置别名并在其中注入一些自定义代码。

标签: ruby-on-rails ruby-on-rails-3 json format respond-to


【解决方案1】:

你可以这样做:

respond_to do |format|
  format.html { @foo = Foo.all(:limit => 10) }
  format.any(:atom, :rss) { @foo = Foo.all }
end

可以在此处找到有关渲染操作内容的较长帖子:http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

【讨论】:

  • 嗯,这不是我想要的,尝试查看我的编辑 (2) 以了解我想要实现的目标。
【解决方案2】:

虽然 Josh 的回答是有效的,但我宁愿看到您的解析代码被包装到一个对象中。如果您将该对象放入应用程序/模型中,它将是可测试的,并且您始终可以使用测试套件验证对逻辑的任何更改。

另一个好处是您可以重复使用 format.json 调用并使您的控制器变得更简单。

【讨论】:

  • 嗯,虽然我喜欢你的建议,但我不能将其标记为答案,因为它不能解决我的问题。请参阅我的编辑 (2),其中我专门提出了我的问题
【解决方案3】:

目前这是不可行的,我阅读了很多 rails 资源,但没有办法访问该方法,因此无法自定义它。

我将编写一个 Rails 插件来支持这一点,最终我会在此处发布,但可以肯定的是,答案实际上是:无法做到

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 2013-04-22
    • 2020-03-02
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多