Создайте простой текстовый помощник 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 должна просто сделать доступную функциональность.