Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails 3控制器中更改视图文件的默认路径?_Ruby On Rails_Ruby_Model View Controller_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 如何在Rails 3控制器中更改视图文件的默认路径?

Ruby on rails 如何在Rails 3控制器中更改视图文件的默认路径?,ruby-on-rails,ruby,model-view-controller,ruby-on-rails-3,Ruby On Rails,Ruby,Model View Controller,Ruby On Rails 3,我有一个名为projectscoontroller的控制器。默认情况下,它的操作在app/views/projects中查找视图。我想更改控制器中所有方法(索引,显示,新建,编辑等)的路径 例如: class ProjectsController < ApplicationController #I'd like to be able to do something like this views_path 'views/mycustomfolder' def index

我有一个名为
projectscoontroller
的控制器。默认情况下,它的操作在
app/views/projects
中查找视图。我想更改控制器中所有方法(
索引
显示
新建
编辑
等)的路径

例如:

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
class ProjectsController
请注意,我不是使用
render
更改每个方法,而是为所有方法定义默认路径。这可能吗?如果是,怎么做


谢谢大家!

如果没有用于此的内置方法,您是否可以覆盖该控制器的
render

class MyController < ApplicationController
  # actions ..

  private

  def render(*args)
    options = args.extract_options!
    options[:template] = "/mycustomfolder/#{params[:action]}"
    super(*(args << options))
  end
end
class MyControllersuper(*(args您可以添加以下内容:

paths.app.views << "app/views/myspecialdir"
path.app.views请参阅

class ProjectsController
您可以在控制器内执行此操作:

  def self.controller_path
    "mycustomfolder"
  end

如果您想在应用程序级别更改所有视图的默认路径,可以执行以下操作-

class ApplicationController < ActionController::Base
  before_action :set_views

  private

  def set_views
    prepend_view_path "#{Rails.root.join('app', 'views', 'new_views')}"
  end
end
class ApplicationController
并在文件夹
new\u views
中按照与原始视图相同的目录结构写入所有视图

附:这个答案的灵感来源于作者的答案


被接受的答案不再适用于我。在经历了许多哀嚎和咬牙切齿之后,我终于发现,如果在操作中未调用
render
,则会调用该方法。在我的情况下,我需要覆盖控制器中的
default\u render
消息,如下所示:

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

这看起来很直观,但实际上会导致以下错误:“ApplicationController:Class的未定义局部变量或方法‘path’”-有什么想法吗?您使用的是什么版本的rails?我在rails 3.0.x中尝试过这一点,在config/Application.rb中的Class Applicationpath.app.views.unshift(“views/myspecialdir”)
会起作用。也就是说,将您自己的特殊条目添加到数组的开头,而不是添加到数组的末尾。Rails可能会从数组的开头查找匹配项。上面的方法对我不起作用,但这确实起作用:
path['app/views']除了
action
变量不存在之外,这实际上非常有效。但是,这与需求无关(我只需要在路径前添加一个文件夹)。非常感谢!prepend_view_path是一个更干净的解决方案。这将在“app/views/mycustomfolder/projects/”中查找视图。命名空间控制器如何?如果我有一个api/v3/todos_controller.rb,它将尝试在app/view/mycustomfolder/api/v3/todos/show.json.rablCurr中查找模板,而不是在app/view/mycustomfolder/todos/show.json.rablCurr中ent位置:(建议的编辑队列已满)出色,工作完美,是imo迄今为止解决此问题的最佳解决方案。这样做是可行的,但会使我的RSpec控制器测试无法使用正确的控制器,除非我指定
use\u route
,这在Rails 4中已被弃用。工作正常,但破坏控制器规范有人知道控制器规范的问题是否是此代码的失败或者控制器规范的工作方式失败?我不知道如何回答这个问题,但我认为无论控制器是如何使用的,这样做都应该是有效的。也许我错了。
def default_render
  render "path/to/views/#{action_name.to_s}"
end