Как я использую define_method для создания методов класса?

Чтобы установить класс для input и label, используйте input_html и label_html:

<%= f.input :role, :wrapper => :horizontal_range, input_html: { class: "col-md-4"}, label_html: {class: "col-md-8"} %>

Что касается второго вопроса - если вы не используете подсказки, возможно, самое простое решение было бы сделать это так:

<%= f.input :pct_of_car , hint: "%",  :wrapper =>:horizontal_range %>

Затем вы можете стилизовать его, добавив пользовательский класс в подсказку с опцией hint_html (аналогично input_html и label_html). [1115 ]

Обновление

Лучшим решением для добавления пользовательского текста является использование блока для ввода:

<%= f.input(:role, :wrapper => :horizontal_range, label_html: {class: "col-md-8"}) do %>
  <div class='col-md-4'>
    <%= f.input(:role, components: [:input], :wrapper => false, label: false) %>
    <span>%</span>
  </div>
<% end %>

Благодаря этому у вашего ярлыка есть класс col-md-8, и ввод с вашим текст заключен в div с классом col-md-4.

106
задан Jon Seigel 16 April 2010 в 20:28
поделиться

2 ответа

Я предпочитаю использовать send для вызова define_method, и мне также нравится создавать метод метакласса для доступа к метаклассу:

class Object
  def metaclass
    class << self
      self
    end
  end
end

class MyClass
  # Defines MyClass.my_method
  self.metaclass.send(:define_method, :my_method) do
    ...
  end
end
25
ответ дан Vincent Robert 24 November 2019 в 03:49
поделиться

Получено из: Jay и Почему , которые также предоставляют способы сделать это красивее.

self.create_class_method(method_name)
  (class << self; self; end).instance_eval do
    define_method method_name do
      ...
    end
  end
end

Обновление : из вклада VR ниже; более краткий метод (если только вы так определяете один метод), который все еще автономен:

self.create_class_method(method_name)
  (class << self; self; end).send(:define_method, method_name) do
    ...
  end
end

, но учтите, что использование send () для доступа к закрытым методам, таким как define_method (), не обязательно является хорошей идеей (мое понимание в том, что он уходит в Ruby 1.9).

8
ответ дан Chinasaur 24 November 2019 в 03:49
поделиться