Добавить контроллер Rails из драгоценного камня

Я разрабатываю rubygem специально для приложений Rails, и я хочу добавить контроллер из своего драгоценного камня, чтобы он был доступен в приложении Rails (похоже на devise работает с RegistrationsController, SessionController).

На стороне драгоценного камня:

Я попытался добавить следующее приложение/контроллеры/samples_controller.rb

class SamplesController < ApplicationController
  def index
    .
    .
  end
end

И затем по моим маршрутам rails добавьте его либо как:

match 'route' => 'samples#index'

или

resources :samples

Очевидно, что у меня что-то не так, но я понятия не имею, что это? Нужно ли мне явно требовать моего SampleController где-нибудь или инициализатор в приложении?

Сейчас я получаю эту ошибку при доступе к маршруту

uninitialized constant SamplesController

Спасибо:)

Ответ 1

Предположим, что ваш драгоценный камень называется MyGem, и у вас есть контроллер под названием SamplesController, который вы хотите использовать в приложении. Ваш контроллер должен быть определен как:

module MyGem
  class SamplesController < ApplicationController
    def whatever
      ...
    end
  end
end

и в вашем каталоге gem он должен жить в app/controllerlers/my_gem/samples_controller.rb(не под папкой lib).

Затем создайте engine.rb в папке gems lib/my_gem с кодом

module MyGem
  class Engine < Rails::Engine; end
end

Вы можете писать маршруты внутри своего драгоценного камня, написав создание route.rb в папке config с кодом

# my_gem/config/routes.rb
Rails.application.routes.draw do
  match 'route' => 'my_gem/samples#index'
end

Заключительная структура что-то вроде этого

## DIRECTORY STRUCTURE
#

- my_gem/
  - app/
    - controllers/
      - my_gem/
        + samples_controller.rb
  - config/
    + routes.rb
  - lib/
    - my_gem.rb
    - my_gem/
      + engine.rb
      + version.rb
  + my_gem.gemspec
  + Gemfile
  + Gemfile.lock

Вот оно.

Ответ 2

Прежде всего, у вас есть опечатка в вашем коде: AppicationController должен быть ApplicationController.

Затем вы не следуете соглашениям об именах Rails (множественное число для ресурсов и т.д.):

  • В ваших маршрутах это должно быть либо resources :samples, либо resource :sample.
  • Ваш класс контроллера должен быть class SamplesController и
  • имя файла контроллера должно быть samples_controller.rb.

Следуйте соглашениям, и вы должны быть в порядке.

Ответ 3

чтобы настроить маршрут, создайте файл route.rb в каталоге конфигурации вашего проекта. Чтобы он совпал с образцом маршрута, выполните следующие действия: конфигурации /routes.rb

Rails.application.routes.draw do
  <resource definition here>
end

приложение/контроллеры/samples_controller.rb

module Samples
  class SamplesController < ApplicationController
    def index
      .
      .
    end
  end
end

Не забудьте включить модуль в контроллер приложения

include 'samples'

Вы посмотрели этот сайт:

http://coding.smashingmagazine.com/2011/06/23/a-guide-to-starting-your-own-rails-engine-gem/