Создайте простой текстовый помощник Rails 3 Gem
Я работаю над своим первым плагином Rails 3, чтобы создать простую вспомогательную функцию, которая мне нравится в ApplicationHelper
всех моих приложений. Вы можете увидеть весь код в Github.
Здесь моя первая попытка:
## lib/semantic_id.rb ##
require 'semantic_id/version'
module ::ActionView::Helpers::TextHelper
def semantic_id
string = String.new
case
when controller.action_name =~ /new|edit/
string += controller.action_name + "_"
when controller.action_name =~ /index|create/
string += controller.controller_name
else
string += controller.controller_name.singularize
end
string += "_view"
end
end
Теперь это работает, но, как я понимаю, это не "Rails 3 Way" для расширения ActiveSupport или любого другого модуля Rails. Я не смог найти много документации о том, как вы "предполагаете", чтобы построить Rails 3. Я пробовал следовать Rails Guide, но метод, заданный там для добавления помощников, не работал, иначе я чего-то не видел.
Мой вопрос:, учитывая приведенный выше код в качестве примера функциональности, которую я ищу, как бы вы превратили это в плагин Rails 3 Gem?
Спасибо!
Ответы
Ответ 1
Проблема с тем, что вы сделали, заключается в том, что вы привязали свою функциональность Gem к ActionView. Было бы лучше сделать его более общим.
Чтобы исправить это, вы должны упаковать свой код в свой собственный модуль и затем вставить этот модуль в среду просмотра. Например, поставьте свой помощник в свой собственный модуль (и файл):
# lib/semantic_id/helper.rb
module SemanticId
module Helper
def semantic_id
...
end
end
end
Затем добавьте его в ActionView с помощью Railtie:
# lib/semantic_id.rb
require 'semantic_id/helper'
ActiveSupport.on_load(:action_view) do
include SemanticId::Helper
end
Вы хотите отделить функциональную часть помощника от части, которая вставляет ее в фреймворк. Ваш метод содержит некоторый код, специфичный для Rails, но если бы этот метод не позволял вам использовать его с Sinatra и другими фреймворками.
В общем, кишки вашего проекта должны быть в lib/<project_name>/*.rb
, а lib/<project_name>.rb
должна просто сделать доступную функциональность.