根据模型更改Rails部分的查找路径

时间:2015-08-11 08:51:50

标签: ruby-on-rails ruby-on-rails-3

我目前有一些类似的模板代码:

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需要一个字符串而不是实际的模板对象。也许有办法得到正确的字符串?或者渲染一个实际的模板?

3 个答案:

答案 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的一部分,可能会有所变化。