2015-07-04 5 views
0

Im просматривая код приложения rails, который я унаследовал, и я не являюсь экспертом в рельсах. В gemfile для приложения есть: gem 'tire'. Отлично, но я ожидаю, что в моделях или контроллерах вам понадобится «шина», чтобы иметь возможность использовать библиотеки, которые предоставляет этот камень. Согласно документации конкретного драгоценного камня, он говорит, что он должен быть включен в качестве микса в класс модели.требуют, чтобы «шинный» камень не упоминался в классе модели, но использование его по-прежнему работает в rails app

include Tire::Model::Search 
include Tire::Model::Callbacks 

Или документация упоминает использовать require 'tire' в классе модели, где вы собираетесь использовать камень шин. Но в проекте я не вижу ни одного из них require/includes в моделях. Модели просто используют api, не требуя в том числе:

ret = Tire.index "icrd" do 
      import [icrdObj] 

      refresh 
     end 

Как это работает? Где я должен смотреть в проекте рельсов, чтобы понять, почему require или include не нужен? Есть ли какая-то автозагрузка?

ответ

1

Bundler имеет много хороших методов. Bundler.setup гарантирует, что вы можете требовать драгоценных камней в своем приложении.

Bundler.require(:default, :production), например (он принимает имена групп) требует все драгоценные камни в Gemfile автоматически выполняя require 'tire', require 'rails' и такие, для вас.

Вы можете пропустить авто-требуешься для некоторых драгоценных камней, добавив require: false рядом с гем строки в Gemfile, как

gem 'rails', require: false

Проверьте Bundler.require документаций (которая находится под groups)

+0

Подождите минутку, вы говорите мне, когда я добавляю камень в gemfile проекта рельсов и запускаю установку пакета, он автоматически добавляет все драгоценные камни в проект rails, который я могу использовать где угодно? Таким образом, я могу использовать API-интерфейс gem в любом месте всего проекта rails, не беспокоясь о добавлении 'include 'tire'' в верхнюю часть рубинового файла, в котором я хочу использовать драгоценный камень? –

+0

Вам не нужно беспокоиться о 'require 'tire'', вам ** нужно ** однако использовать' include Tire :: Model :: Search', если камень требует от вас этого, только 'require' не необходимо с пакетом в rails –

+0

Почему я не понимаю, 'require' не нужен, если мы используем bundler. Но почему Tire :: Model :: Search нужно «включить»? –

1

Когда драгоценный камень включен в Gemfile, связанный оператор require .. автоматически вызывается.

См. http://www.justinweiss.com/blog/2014/10/13/how-does-rails-handle-gems/ для объяснения того, как рельсы обрабатывают драгоценные камни.

С этим BlogPost:

Так, Bundler будет выглядеть в вашем Gemfile для драгоценных камней, принадлежащих к каждому из этих групп и призовите требует от каждого из драгоценных камней, которые он находит. Если у вас есть драгоценный камень nokogiri, он потребует для вас «nokogiri». И это , почему ваши драгоценные камни обычно просто работают в Rails, без дополнительного кода на ваша роль.

+0

Спасибо. Как насчет 'include Tire :: Model :: Search' и' include Tire :: Model :: Callbacks'? Это необходимо и почему? –

+0

Не быть грубым, но вам действительно нужно изучить Ruby перед Rails, если вы зададите этот вопрос, это сделает все понятным. –

+0

@HorseVoice: инструкции 'include' в этом случае предоставляют вам чистый способ реализации функциональности' search' для модели, как описано в https://github.com/karmi/retire#activemodel-integration. Вы также можете использовать api напрямую (что, похоже, имеет место в приложении, которое вы унаследовали). –