Проблемы с отображением представления (ActionView :: MissingTemplate ... Error) в пользовательском плагине - PullRequest
3 голосов
/ 07 декабря 2009

Я пытаюсь разработать плагин для Ruby on Rails и столкнулся с проблемами при рендеринге моего HTML-представления. Моя структура каталогов выглядит так:

Структура файла

---/vendor
      |---/plugins
             |---/todo
                     |---/lib
                            |---/app
                                    |---/controllers
                                            |---todos_controller.rb
                                    |---/models
                                            |---todos.rb
                                    |---/views
                                            |---index.html.erb
                             |---todo_lib.rb
                     |---/rails
                             |---init.rb

В /rails/init.rb

require 'todo_lib'

В /lib/app/todo_lib.rb

%w{ models controllers views }.each do |dir|
  # Include the paths:
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/lib/app/models
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/lib/app/controllers
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/lib/app/views
  path = File.expand_path(File.join(File.dirname(__FILE__), 'app', dir))
  # We add the above path to be included when Rails boots up
  $LOAD_PATH << path
  ActiveSupport::Dependencies.load_paths << path
  ActiveSupport::Dependencies.load_once_paths.delete(path)
end

В todo / lib / app / controllers / todos_controller.rb

class TodosController < ActionController::Base
  def index
  end
end

В todo / lib / app / views / index.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "[url]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Todos:</title>
</head>
<body>
<p style="color: green" id="flash_notice"><%= flash[:notice] %></p>
<h1>Listing Todos</h1>
</body>
</html>

В /myRailsApp/config/routes.rb

ActionController::Routing::Routes.draw do |map|
  # The priority is based upon order of creation: first created -> highest priority.

  map.resources :todos
  ...

Я получаю следующую ошибку:

Шаблон отсутствует

Отсутствует шаблон todos / index.erb в пути просмотра приложения / views

Может кто-нибудь подать мне руку и сказать, что я здесь делаю неправильно, из-за чего мой файл index.html.erb не отображается? Очень ценится!


EDIT:

Я уже безуспешно попробовал следующее:

В /todo/lib/app/controllers/todos_controller.rb

def index
   respond_to do |format|
      format.html # index.html.erb
    end
end

EDIT:

хакунин решил эту проблему. Вот решение.

Он говорит, что я создаю плагин для движка Rails (я понятия не имел, что делаю это), и для него требуется другая структура каталогов, такая, которая выглядит примерно так:

Структура файла

---/vendor
      |---/plugins
             |---/todo
                     |---/lib
                     |---/app
                            |---/controllers
                                    |---todos_controller.rb
                            |---/models
                                    |---todos.rb
                            |---/views
                                    |---/todos
                                            |---index.html.erb
                            |---todo_lib.rb
                     |---/rails
                            |---init.rb

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

В todo / lib / todo_lib.rb

%w{ models controllers views }.each do |dir|
  # Include the paths:
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/app/models
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/app/controllers
  # /Users/Me/Sites/myRailsApp/vendor/plugins/todo/app/views
  path = File.expand_path(File.join(File.dirname(__FILE__), '../app', dir))
  # We add the above path to be included when Rails boots up
  $LOAD_PATH << path
  ActiveSupport::Dependencies.load_paths << path
  ActiveSupport::Dependencies.load_once_paths.delete(path)
end

Сделанное выше изменение находится в строке: path = File.expand_path (File.join (File.dirname ( FILE ), '.. / app' , реж)). [Игнорируйте смелое «ФАЙЛ», это проблема веб-сайта].

Запуск сценария / сервера отобразит страницу index.html.erb в каталоге todo / app / views / todos.

1 Ответ

1 голос
/ 07 декабря 2009

Похоже, вы хотите создать плагин "engine". Создайте каталоги «app» и «config» в корне директории вашего плагина (не в / lib). Вы можете использовать app / views / и app / controllers в своем плагине, как если бы это было полнофункциональное приложение Rails. В config / rout.Rb вы должны объявить маршруты, введенные вашим движком.

См. http://github.com/neerajdotname/admin_data для приличного примера того, как выглядит двигатель.

...