我目前有一些类似的模板代码:
ssh $BNAME@$BServ "mkdir $BackupDir/$BNAME/$DATE"
Rails会在render partial: 'reference', locals: { object: object }
和_reference.html.erb
中查找部分app/views/application/
。
但是,此视图位于独立控制器中,与正在呈现的app/views/controller_name/
无关,因此不会查看对象的视图目录object
。我不能使用标准app/views/object
语法并让Rails自动找出部分路径,因为我不想呈现render object
部分,而是object/object
部分。
我怎样才能解决这个问题?
我在想:
object/reference
语法但指定不同部分名称的方法;或使用不同方法查找部分的辅助函数,使用类似:
render object
我尝试了什么
我尝试使用第二种方法:
render partial: find_partial('reference', object), locals: { object: object }
这是非常接近做我想要的,即它找到正确的部分,如果没有,则回退到通用def find_partial(name, object)
lookup_context.find name, [object.class.model_name.plural, 'application'], true
end
。但是,它会找到实际的application/reference
,而ActionView::Template
需要一个字符串而不是实际的模板对象。也许有办法得到正确的字符串?或者渲染一个实际的模板?
答案 0 :(得分:4)
您可以覆盖模型中的to_partial_path
方法,此方法由render调用,以确定要为此模型呈现的部分路径。
例如在你的Model.rb
中def to_partial_path
"references/#{kind}"
end
参考: http://cookieshq.co.uk/posts/rails-tips-to-partial-path/ http://apidock.com/rails/ActiveModel/Conversion/to_partial_path
答案 1 :(得分:1)
这不是非常优雅,但我有一个工作解决方案在视图中调用它:
render partial: find_partial(:reference, object), locals: { object: object }
将find_partial
帮助器实现为:
def find_partial(name, object)
[object.class.model_name.plural, 'application'].each do |dir|
return "#{dir}/#{name.to_s}" if lookup_context.exists?(name.to_s, dir, true)
end
raise "Cannot find partial #{name} for #{object}"
end
答案 2 :(得分:1)
这对我有用:在控制器中,
before_action :set_lookup_prefixes
def set_lookup_prefixes
lookup_context.prefixes << "special_folder"
end
只是附加它,但您可以在prefixes
数组中的任意位置注入您的路径。
警告:我通过在ActionView::LookupContext
类的源代码中找到它,它不是API的一部分,可能会有所变化。