Написание Rails Gems: правильный способ добавить к существующим модулям Rails? - PullRequest
1 голос
/ 21 марта 2012

Я только начинаю с гемов rails и задаюсь вопросом, как лучше всего добавить функциональность в существующие модули rails.Например, если бы я хотел добавить новый помощник по форме, я бы обычно делал что-то вроде этого:

class ActionView::Helpers::FormBuilder
  # My form defs in here
end

Но мне интересно, если это самый элегантный способ сделать что-то - особенно если, дляНапример, я собираюсь обернуть новую функциональность в гем.

Например, предположим, что я создаю гем "MyGem", и я хочу, чтобы его функциональность присутствовала только в том случае, если гем называетсяв контроллере.Поэтому в контроллере я добавляю «include MyGem», а в lib / my_gem.rb я обычно делаю что-то вроде:

# lib/my_gem.rb
module MyGem
  # My form defs in here
end

Вопрос в том, каков стандартный способ перезаписи def вActionView :: Helpers :: FormBuilder из модуля MyGem?

Приветствия ...

1 Ответ

2 голосов
/ 21 марта 2012

Если вы создаете класс с наследованием ActionView::Helpers::FormBuilder, вы можете переопределить все методы из FormBuilder, которые вы хотите.

Вы также можете добавить другой метод.

После того, как вам просто нужно использовать этот FormBuilder, когда вы создаете форму с параметром :builder Или вы можете создать вспомогательный метод, например simple_form_for, для вызоваform_for метод с вашим строителем.

Если вы хотите сделать в модуле, вам нужно создать свой класс в модуле

# lib/my_gem.rb
require 'my_gem/form_builder'

# lib/my_gem/form_builder.rb
module MyGem
  class FormBuilder < ActionView::Helpers::FormBuilder
    # form def
  end
end

В вашем строителе вы используете :builder => MyGem::FormBuilder

...