使用自定义格式别名json格式的respond_to,这可能吗?

时间:2011-12-11 18:37:45

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

我遇到的情况是我将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

如果我写的话,可以让铁道理解:

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

必须这样做:

format.extjson { render_to_extjson }

默认情况下?

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

虽然Josh的答案是有效的,但我宁愿看到你的解析代码被包装成一个对象。如果您将该对象放入app / models中,它将是可测试的,您可以随时使用测试套件验证对逻辑的任何更改。

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

答案 2 :(得分:0)

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

我会写一个rails插件来支持这个,最后我会在这里发布,但肯定的答案实际上是:这不能完成