【问题标题】:Rails Override RenderRails 覆盖渲染
【发布时间】:2016-04-05 02:41:25
【问题描述】:

是否可以为 :html 响应覆盖 Rails 的渲染行为?我想始终呈现相同的模板(忽略神奇的视图查找)。

我正在编写一个单页应用程序,这似乎应该是可能的......基本上,如果它被请求为 :json 它应该呈现 JSON,但如果它被请求为 :html 它应该传递数据无论如何都到相同的视图(它将在正文中呈现为 JSON)。

【问题讨论】:

  • 这是否意味着您希望在 HTML 的 <body> 标记中包含 JSON。还是您的意思是 HTML 响应的正文?
  • 对不起.. 我想我不明白你的问题。如果您正在编写单页应用程序,这是否意味着您将通过 ajax 发出请求?如果是这样,你为什么要渲染其他 html 视图? json还不够吗?如果你想在你的 json 模板上重用代码,你可以使用 jbuilder gem。
  • @AnthonyE 我确实希望 JSON 在 script 标签内呈现,是的。和@Aldana 提前将给定页面所需的数据引导到脚本元素中是很常见的做法;它会在您启动应用程序时保存请求。
  • @Crisfole 嘿.. 我一直在考虑这个.. 你找到解决方法了吗? method_missing 怎么样?元编程可能是这里的答案。
  • 嘿,我刚刚创建了布局和一堆空的.html.erb 文件。为我工作。

标签: ruby-on-rails content-negotiation


【解决方案1】:

尝试删除 application.html.erb 上的 yield 部分,那么您将始终得到没有任何部分的 application.html.erb。

【讨论】:

  • 测试一下,这可能是我需要的。
  • 不。这会导致缺少模板异常。
  • 误解了。通过添加仅呈现正确脚本的 application/index.html.erb 路由来实现此功能。我认为现在应该这样做......
  • 我发现你的问题很有趣。你能进一步解释一下你是如何让它工作的吗? :)
  • @Aldana 现在它只适用于索引视图(例如,仍在研究如何自动呈现索引以响应显示)。如果您从ApplicationController 继承,则会在继承树中搜索与该操作匹配的文件。这有意义吗?
【解决方案2】:

如果您定义一个视图,然后在每个控制器上的每个操作之后呈现该视图,该怎么办?像这样:

app/controllers/home_controller.rb

class HomeController < ApplicationController
  def home
  end
end

app/views/home/home.html.erb

<!-- Whatever html code and script tags here -->

app/controllers/another_controller.rb

class AnotherController < ApplicationController
  def action
    render "home/home"
  end
end

你甚至可以定义一个 after_filter

编辑

我试过了,效果很好。 after 过滤器似乎不起作用。

【讨论】:

  • 嘿@Aldana,谢谢! A+ 表示努力。我希望手动调用render :D
【解决方案3】:

为什么不将 JSON 数据作为实例变量传递?

控制器

@json_data = whatever_model.to_json

application.html.erb

<script>
<%= @json_data %>
</script>

【讨论】:

  • 嘿 Anthony,这正是我正在做的 :) 我试图弄清楚如何始终呈现 application.html.erb,而不管调用了什么控制器或操作。
猜你喜欢
  • 2017-08-28
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2017-12-11
  • 2012-08-14
  • 2014-01-31
  • 2012-01-01
  • 2016-05-13
相关资源
最近更新 更多