Railtie(gem): Как мне включить и отобразить эрб-партиалы?

Я работаю над Railtie(гемом) для встраивания видео, таких как YouTube, Vimeo и т. Д.

В этом геме я хочу иметь помощника вида, чтобы я мог вызвать embed_video (embeddable, width, height)

Итак, я создал помощника как помощника, и он работает, но я хотел бы реорганизовать его, чтобы использовать партиалы, чтобы сделать его чище, но мне трудно это сделать.

Помощник:

module ViewHelpers
  def embed_video(embeddable, width, height)
    if embeddable.video_on_youtube?
      content_tag :iframe, nil, width: width, height: height,
        src: "//www.youtube.com/embed/#{embeddable.video_id}",
        allowfullscreen: true, frameborder: 0
    elsif embeddable.video_on_vimeo?
      content_tag :iframe, nil, width: width, height: height,
        src: "//player.vimeo.com/video/#{embeddable.video_id}",
        webkitallowfullscreen: true, mozallowfullscreen: true,
        allowfullscreen: true, frameborder: 0
    elsif embeddable.video_on_dailymotion?
      content_tag :iframe, nil, width: width, height: height,
        src: "//www.dailymotion.com/embed/video/#{embeddable.video_id}",
        webkitallowfullscreen: true, mozallowfullscreen: true,
        allowfullscreen: true, frameborder: 0
    elsif embeddable.video_on_veoh?
      %Q{
        <object width='#{width}' height='#{height}' id='veohFlashPlayer' name='veohFlashPlayer'>
          <param name='movie' value='http://www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1446&permalinkId=#{embeddable.video_id}&player=videodetailsembedded&videoAutoPlay=0&id=anonymous'></param>
          <param name='allowFullScreen' value='true'></param>
          <param name='allowscriptaccess' value='always'></param>
          <embed src='http://www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1446&permalinkId=#{embeddable.video_id}&player=videodetailsembedded&videoAutoPlay=0&id=anonymous' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='#{width}' height='#{height}' id='veohFlashPlayerEmbed' name='veohFlashPlayerEmbed'>        </embed>
        </object>
      }.html_safe
    #
    # And more providers...
    #
  end
end

С использованием частичных я хочу написать это так:

module ViewHelpers
  def embed_video(embeddable, width, height)
    if embeddable.video_on_youtube?
      render 'youtube', embeddable: embeddable, width: width, height: height
    elsif embeddable.video_on_veoh?
      render 'veoh'#...etc
    end
  end
end

Моя попытка решения:

  • Создать папку:lib / embeddable / partials

  • Добавьте частичное для veoh:lib / embeddable / partials / _veoh.html.erb

Добавить пути просмотра в railtie.rb

module Embeddable
  class Railtie < Rails::Railtie
    # ...load view helpers... #

    initializer 'embeddable.add_autoload_paths', :before => :set_autoload_paths do |app|
      app.config.autoload_paths << app.root.join("lib/embeddable/partials").to_s
    end

    # My attempt at adding the partials to the view path
    initializer 'embeddable.add_view_paths', :after => :add_view_paths do |app|
      ActiveSupport.on_load(:action_controller) do
        append_view_path app.root.join("lib/embeddable/").to_s
      end
    end
  end
end

Когда я пытаюсь сделать представление, я получаю следующую ошибку:

ActionView::MissingTemplate: Missing partial partials/veoh with {:locale=>[:nb], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :rabl, :haml]}. Searched in:
  * "/home/me/Arbeid/the_application/app/views"
  * "/home/me/.rvm/gems/ruby-2.1.0/gems/kaminari-0.15.1/app/views"
  * "/home/me/Arbeid/the_application/lib/embeddable"

2 ответа

Решение

После большого количества ошибок и ошибок мне удалось заставить его работать. Вот что я должен был сделать:

Я изменил это:

initializer 'embeddable.add_view_paths', :after => :add_view_paths do |app|
  ActiveSupport.on_load(:action_controller) do
    append_view_path app.root.join("lib/embeddable/").to_s
  end
end

В это:

initializer 'embeddable.add_view_paths', :after => :add_view_paths do |app|
  ActiveSupport.on_load(:action_controller) do
    append_view_path "#{Gem.loaded_specs['embeddable'].full_gem_path}/lib/embeddable"# <- this is the change
  end
end

Теперь я могу визуализировать партиалы от помощника следующим образом:

render 'partials/youtube', id: video_id, width: width, height: height

Я знаю, что это не прямой ответ на ваш вопрос, но вместо того, чтобы изобретать велосипед, я бы предпочел использовать гем AutoHTML:

auto_html - это расширение Rails для преобразования URL-адресов в соответствующий ресурс (изображение, ссылка, YouTube, видео Vimeo,...). Это идеальный выбор, если вы не хотите мешать посетителям с помощью богатого HTML-редактора или кода разметки, но вы все же хотите позволить им вставлять видео, изображения, ссылки и многое другое на ваш сайт, просто вставляя URL.

https://github.com/dejan/auto_html

Чтобы ответить на ваш вопрос напрямую, я думаю, что проблема в том, что вы перепутали путь автозагрузки и путь просмотра.

У тебя должно быть

app.config.autoload_paths << app.root.join("lib/embeddable").to_s

а также

append_view_path app.root.join("lib/embeddable/partials").to_s
Другие вопросы по тегам