Rails/JBuilder 的现有文件缺少部分错误

Missing partial error for existing file with Rails/JBuilder

我在 Rails 4.2 上使用 JBuilder(版本 ~>2.0)渲染 JSON 部分时遇到问题。尽管文件存在,但它给我 ActionView missing partial 错误,它似乎忽略了我提供的路径并搜索默认的魔法路径。我意识到将部分放在魔法路径上会修复它,但出于多种原因,最好将部分保留在原处并正确找到它。从我的 /views 目录结构中的其他地方(特别是 /views/api/task_templates/_task_template.json.jbuilder)中的其他地方可以正确找到该部分。

主 JBuilder 文件,它本身是一个部分文件 (_task_template.json.jbuilder):

json.task_files task_template.task_files.each do |file|
  json.partial! file, partial: 'api/task_files/task_file', as: :task_file
end

部分文件(_task_file.json.jbuilder):

json.(task_file, :id, :file_type, :name, :original_path, :image_path, :icon, :organization_id, :viewer)

错误信息:

ActionView::Template::Error:
        Missing partial api/v1/task_files/_task_file with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:jbuilder]}. Searched in:
          * "/Users/lucy/trail-app/app/views"
          * "/Users/lucy/.rvm/gems/ruby-2.1.3@trail-app/gems/sidekiq_monitor-0.1.7/app/views"
          * "/Users/lucy/.rvm/gems/ruby-2.1.3@trail-app/gems/devise_invitable-1.7.0/app/views"
          * "/Users/lucy/.rvm/gems/ruby-2.1.3@trail-app/gems/devise-4.2.0/app/views"

这是我的目录结构:

/views > /api > /task_files > _task_file.json.jbuilder (THE MISSING PARTIAL)
              > /v1         > /task_templates > _task_template.json.jbuilder (THE MAIN FILE)

我在寻找完全不同的东西的同时,终于在 Ruby 文档的深处找到了这个问题的答案,所以我把它记录在这里,供任何可能来寻找答案的人使用。

甚至不必费心在 JBuilder 文件中提供部分选项。添加一个方法,到你正在制作的 class 部分,称为 to_partial_path。该方法应该 return 您想要的部分路径的字符串。

例如,在我的例子中:

JBuilder 主文件:

json.task_files task_template.task_files.each do |file|
  json.partial! file, as: :task_file
end

在任务文件模型中(task_file.rb):

class TaskFile
  def to_partial_path
    'api/task_files/task_file'
  end
end

部分文件保持不变。行得通。