如何向 Rails 的部分渲染查找添加视图路径? [英] How can I add a view path to Rails's partial rendering lookup?
问题描述
我想要以下目录结构:
views/
app1/
users/_user.html.erb
users/index.html.erb
app2/
users/index.html.erb
shared/
users/_user.html.erb
users/index.html.erb
在我看来,我会打电话
# app1/users/index.html
<%= render :partial => "user" %>
# => /app1/users/_user.html.erb
# app2/users/index.html
<%= render :partial => "user" %>
# => /shared/users/_user.html.erb
所以基本上,在引发丢失模板错误之前,我如何告诉 Rails 检查/app2/users 目录然后检查共享目录?
So basically, how do I tell Rails to check in the /app2/users dir then the shared dir before it raises it's missing template error?
我解决了这个问题(按照 Senthil 的建议,使用 File.exist?
I got around this (as suggested by Senthil, using File.exist?
这是我的解决方案 - 欢迎反馈和建议
Here's my solution - feedback and suggestions welcome
# application_helper.rb
# Checks for a partial in views/[vertical] before checking in views/shared
def partial_or_default(path_name, options={}, &block)
path_components = path_name.split("/")
file_name = path_components.pop
vertical_file_path = File.join(vertical}, path_components, file_name)
shared_file_path = File.join("shared", path_components, file_name)
full_vertical_file_path = File.join("#{Rails.root}/app/views/", "_#{vertical_file_path}.html.erb")
attempt_file_path = File.exist?(full_vertical_file_path) ? vertical_file_path : shared_file_path
render({:partial => attempt_file_path}.merge(options), &block)
end
推荐答案
rails 中已经有一些东西可以为您提供这种类型的主题化".它称为prepend_view_path.
There's already something built into rails that facilitates this type of "theming" for you. It's called prepend_view_path.
http://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-prepend_view_path
还有 append_view_path 用于将路径添加到查找堆栈的末尾.
There's also append_view_path for adding paths to the end of the lookup stack.
我在生产中成功地做到了这一点:
I have this successfully working in production:
class ApplicationController < ActionController::Base
before_filter :prepend_view_paths
def prepend_view_paths
prepend_view_path "app/views/#{current_app_code}"
end
end
现在每个控制器将首先在views/app1"(或任何你的动态名称)中查找与被调用的操作对应的视图.
Now every controller will first look in "views/app1" (or whatever your dynamic name turns out to be) for the views corresponding to the action being called.
它也足够智能,可以检查您要查找的文件的所有定义路径,因此如果找不到,它会回滚到默认位置.
It's also smart enough to check all the defined paths for the file you're looking for, so it rolls back to the default location if one isn't found.
这篇关于如何向 Rails 的部分渲染查找添加视图路径?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!