簡體   English   中英

如何更改 Rails 3 控制器中視圖文件的默認路徑?

[英]How to change the default path of view files in a Rails 3 controller?

我有一個名為ProjectsController的控制器。 默認情況下,它的操作會在app/views/projects查找視圖。 我想更改控制器中所有方法( indexshownewedit等)的路徑。

例如:

class ProjectsController < ApplicationController

  #I'd like to be able to do something like this
  views_path 'views/mycustomfolder'

  def index
    #some code
  end

  def show
    #some code
  end

  def new
    #some code
  end

  def edit
    #some code
  end
end

請注意,我沒有使用render更改每個方法,而是為所有方法定義默認路徑。 這可能嗎? 如果是這樣,如何?

謝謝!

請參閱ActionView::ViewPaths::ClassMethods#prepend_view_path

class ProjectsController < ApplicationController
    prepend_view_path 'app/views/mycustomfolder'
    ...

您可以在控制器中執行此操作:

  def self.controller_path
    "mycustomfolder"
  end

如果沒有為此的內置方法,也許您可​​以覆蓋該控制器的render

class MyController < ApplicationController
  # actions ..

  private

  def render(*args)
    options = args.extract_options!
    options[:template] = "/mycustomfolder/#{params[:action]}"
    super(*(args << options))
  end
end

不確定這在實踐中的效果如何,或者它是否有效。

您可以添加如下內容:

paths.app.views << "app/views/myspecialdir"

在 config/application.rb 文件中,讓 rails 在另一個目錄中查找視圖模板。 一個警告是它仍然會尋找與控制器匹配的視圖文件。 因此,如果您有一個名為 HomeController 且具有上述視圖配置的控制器,它將尋找名為“app/views/myspecialdir/home/index.html.erb”的內容來呈現。

如果您想在應用程序級別更改所有視圖的默認路徑,您可以執行以下操作 -

class ApplicationController < ActionController::Base
  before_action :set_views

  private

  def set_views
    prepend_view_path "#{Rails.root.join('app', 'views', 'new_views')}"
  end
end

並按照與原始目錄結構相同的目錄結構將所有視圖寫入文件夾new_views

PS - 這個答案的靈感來自@mmell的答案。

接受的答案不再適用於我。 在苦苦哀求和咬牙切齒之后,我設法發現如果在動作中沒有調用render ,則調用default_render方法。 就我而言,我需要按如下方式覆蓋控制器中的default_render消息:

def default_render
  render "path/to/views/#{action_name.to_s}"
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM