在Ruby on Rails中设置自定义mimetypes的视图格式?

时间:2012-01-19 01:07:53

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

我正在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视图。

2 个答案:

答案 0 :(得分:2)

我按照你的要求

  

我希望这种格式基本上提供与.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相同的动作但具有不同的布局。

答案 1 :(得分:-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。