如何向 Rails 的部分渲染查找添加视图路径? [英] How can I add a view path to Rails's partial rendering lookup?

查看:20
本文介绍了如何向 Rails 的部分渲染查找添加视图路径?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要以下目录结构:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆