【问题标题】:rails 3 custom mime type - default view formatrails 3 自定义 mime 类型 - 默认视图格式
【发布时间】:2011-01-22 16:34:37
【问题描述】:

我需要渲染一些没有布局的视图。 跳过线 :render :layout=>false 和 if else 来自控制器操作的逻辑, 我有自定义 mime 类型,如 phtml(纯 html)。

Mime::Type.register "text/phtml", :phtml

这种格式需要渲染相同的 html 视图,但只是没有布局。我用 app.js 中的这段代码完成了这个。控制器:

 before_filter proc { |controller|
  if params[:format] && params[:format]=='phtml'
    controller.action_has_layout = false
    controller.request.format    = 'html'

  end
  }

首先,这很难看,其次我无法再从控制器中控制这种格式:

respond_to :phtml,:only=>:index

因为它总是以请求的 phtml 格式呈现视图。 有更好的解决方案吗?例子?如何为视图格式设置别名?

非常感谢

【问题讨论】:

  • 我一直认为.phtml 是用于 PHP/PERL 风格的 HTML。
  • 你是对的。可以是 .plain_html...这不是重点...
  • 我也有这个问题,我还需要一种渲染“纯 html”的方法。 必须有一个很好的方法来做到这一点,因为肯定会出现很多。我不想重复我所有的控制器操作(不是很干)。我还不知道一个好的解决方案,但你的信息对我有帮助,谢谢。
  • 关于内容类型,我个人仍然将我的自定义扩展名声明为“text/html”,因为它就是这样——只是使用了不同的扩展名。就像“.htm”和“.html”都是“text/html”一样。

标签: ruby-on-rails-3 views format alias


【解决方案1】:

您可以直接在控制器中使用layout 方法:

class ProductsController < ApplicationController
  layout "product", :except => [:index, :rss]
end

或者根本不使用布局:

class ProductsController < ApplicationController
  layout nil
end

查看the guide 了解更多信息。

【讨论】:

  • 感谢您的回答。这对我来说不是解决方案,因为我需要在同一个动作中两种情况(有或没有布局)。这就是我需要另一种格式的原因。这对于以下情况很有用:打印、从 javascript 获取“普通”html 等...
  • layout 也接受 proc,这将允许您根据请求的格式有条件地选择布局。查看指南 (guides.rubyonrails.org/layouts_and_rendering.html) 了解更多信息。
  • ok...它可以解决布局问题。但它不能解决html格式。它仍然会寻找 phtml 或(plain_html)模板。我需要解决这个问题的方法。最后,我们仍然有一个布局过程块的逻辑。 :)。我正在寻找一种解决方案来覆盖 AppResponder
【解决方案2】:

我还没有找到更好的解决方案,只更新到我之前的例子:

 before_filter proc { |controller|
    if params[:format] && params[:format]=='plain_html' && controller.collect_mimes_from_class_level.include?(:plain_html)
      controller.action_has_layout = false
      controller.request.format    = 'html'
    end
  }

我添加了这一行来检查我们控制器中定义的新格式:

controller.collect_mimes_from_class_level.include?(:plain_html)

现在我们可以拥有全新的格式,它将呈现我们的标准 html 视图,而不是为新格式构建新视图。

如果我们不想共享现有的 html 代码,而是根据请求的格式构建不同的逻辑,这将很有用。

例如,我们可以轻松地准备要打印的 html 内容,例如:

class PagesController < ActionController::Base

layout 'print',:only=>:show
respond_to :plain_html,:only=>[:show]

  def show
    Page.find(1)
    respond_with @page
  end
end

请求会是这样的:

http://www.example.com/pages/1.plain_html

我希望有人会觉得这很有用。

如果你有更好的方法来做到这一点,请与我们分享。

问候

【讨论】:

  • 这很好,但它对我不起作用,因为我需要能够渲染嵌套布局。 (将 action_has_layout 设置为 false 会删除所有布局。)
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2015-10-28
相关资源
最近更新 更多