Rails 3 自定义 mime 类型 - 默认视图格式

发布于 2024-10-13 17:03:07 字数 619 浏览 7 评论 0原文

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

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

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

 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 渲染视图。 有更好的解决方案吗?例子?我如何为视图格式添加别名?

非常感谢

I need to render some views without layout.
To skip line :render :layout=>false and if else logic from controller actions,
i have custom mime type like phtml (plain html).

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

this format need to render the same html views, but only without layout. I complete this with this chunk of code in app. controller:

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

  end
  }

First, this is ugly, second i can't any more control this format from controller in the way:

respond_to :phtml,:only=>:index

because it will always render view with requested format phtml.
is there a better solution? example? how can i alias view formats?

Thank a lot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苄①跕圉湢 2024-10-20 17:03:07

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

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

或者根本不使用布局:

class ProductsController < ApplicationController
  layout nil
end

查看 指南了解更多信息。

You can use the layout method in your controller directly:

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

Or to use no layout at all:

class ProductsController < ApplicationController
  layout nil
end

Check out the guide for more info.

冷默言语 2024-10-20 17:03:07

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

 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

我希望有人会发现这很有用。

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

问候

I haven't found better solution,only update to my previous example:

 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
  }

i added this line to check is a new format defined into our controller:

controller.collect_mimes_from_class_level.include?(:plain_html)

Now we can have full new format which will render our standard html vews rather the build new views for the new format.

This can be useful if we wont to share existing html code, but build different logic based on requested format.

For example, we can easily prepare our html content for print like:

class PagesController < ActionController::Base

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

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

And request will be like:

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

I hope that someone will find this useful.

If u have a better approach for doing this, please share with us.

Regards

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文