web-dev-qa-db-ja.com

Rails 3コントローラーのビューファイルのデフォルトパスを変更する方法は?

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で変更するのではなく、それらすべてのデフォルトパスを定義することに注意してください。これは可能ですか?もしそうなら、どうですか?

ありがとうございました!

45
Yuval Karmi

このための組み込みメソッドがない場合は、そのコントローラーのrenderをオーバーライドできますか?

class MyController < ApplicationController
  # actions ..

  private

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

これが実際にどれほどうまく機能するか、またはまったく機能するかどうかはわかりません。

22
August Lilleaas

ActionView :: ViewPaths :: ClassMethods#prepend_view_path を参照してください。

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

あなたはあなたのコントローラーの中でこれを行うことができます:

  def self.controller_path
    "mycustomfolder"
  end
31
Ravenstine

次のようなものを追加できます。

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

config/application.rbファイルでRailsビューテンプレートを別のディレクトリで検索します。注意点の1つは、コントローラに一致するビューファイルを引き続き検索することです。そのため、ビューの上記の構成を持つHomeControllerという名前のコントローラーは、レンダリングする「app/views/myspecialdir/home/index.html.erb」という名前の何かを探します。

11
Mike Gorski

すべてのビューのデフォルトパスをアプリレベルで変更したい場合は、次のようにします-

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フォルダーに、オリジナルと同じディレクトリー構造に従って書き込みます。

追伸-この回答は @ mmell の回答から発想を得たものです。

1
Swaps