【问题标题】:Setting view formats for custom mimetypes in Ruby on Rails?在 Ruby on Rails 中为自定义 mimetype 设置视图格式?
【发布时间】:2012-01-19 01:07:52
【问题描述】:

我正在 Rails 中创建一个自定义 mimetype 以与 respond_to 一起使用

Mime::Type.register_alias "text/html", :modal

我想像这样在 respond_to 中使用这种 mime 类型:

respond_to do |format|                                                                                                                                     
  format.html{ render 'index'}                                                                                                                             
  format.modal{ render 'index', :layout => 'bare'}                                                                                      
 end  

我希望这种格式基本上提供与 .thml 格式相同的视图,但布局不同

我收到一个缺少模板的错误

Missing template support/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:modal], :locale=>[:en, :en]} in view paths "/remote/app/views",

它正在寻找一个名为 index.modal.erb 的视图 我目前只有index.html.erb

我已经尝试创建index.modal.erb,它确实可以工作,但是布局也有同样的问题,我只有bare.html.erb 的布局

我真的不想为不同的 mime 类型复制这些视图文件。我希望有一种方法可以让自定义 mime 类型回退到我缺少的 html 视图。

【问题讨论】:

  • 到目前为止,我发现的唯一功能性解决方案是将所有视图从 view.html.erb 重命名为 view.erb,这样 rails 就不会寻找特定的格式,而只是默认为view.erb 这在具有大量现有视图文件的项目中不太理想。

标签: ruby-on-rails ruby-on-rails-3 erb rails-routing


【解决方案1】:

我按照你的要求去做

我希望这种格式基本上提供与 .html 格式相同的视图,但布局不同

我有一个不同的方法应该在 Rails 3 中工作(在 Rails 3.2.12 中测试)。将以下内容放入您的控制器中:

  before_filter do
    @bare= (params[:format] == 'modal')

    if @bare
      params[:format]= 'html'
      request.format= :html
    end
  end

  layout :select_layout

  # standard controller stuff

  # ...
  # Towards bottom of your controller code, 
  private
  def select_layout
    @bare ? 'bare' : nil
  end

总结:

  • 将格式改回 html。
  • 设置一个变量来表明它需要服务“裸”
  • 告诉控制器布局的值将由函数给出。 (请参阅http://guides.rubyonrails.org/layouts_and_rendering.html 中的“在运行时选择布局”)
  • 无需对任何 respond_to 块进行更改。

这将完全满足您的需要,即与 .html 相同的操作,但布局不同。

【讨论】:

    【解决方案2】:

    您使用的是什么版本的 Rails?如果是 3.2,请尝试为您的模态响应显式设置格式:

    respond_to do |format|                                                                                                                                     
      format.html  { render 'index'}                                                                                                                             
      format.modal { render 'index', :formats => [:html], :layout => 'bare'}                                                                                      
    end
    

    这应该使它呈现 index.html.erb 而不是 index.modal.erb。

    【讨论】:

    • 不幸的是,该项目是 rails 3.0.11。这个解决方案似乎不起作用。它是在以后的版本中引入的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2012-04-03
    相关资源
    最近更新 更多