3

我有一种情况,我将 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 }

默认情况下?

4

3 回答 3

0

您可以执行以下操作:

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/

于 2011-12-11T21:01:46.197 回答
0

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

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

于 2011-12-11T21:06:26.223 回答
0

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

我将编写一个 Rails 插件来支持这一点,最终我会在这里发布,但可以肯定的是,答案实际上是:这不能完成

于 2012-01-11T20:43:43.110 回答