Rails: Как отключить звездочку в обязательных полях формы? - PullRequest
37 голосов
/ 04 октября 2011

Когда я добавляю атрибут «Обязательно»в поля ввода html, Rails предварительно ожидает звездочку (*) перед меткой.

Кто-нибудь знает, как это предотвратить?

По какой-то причине Rails преобразует это:

<%= f.input :Company, :input_html => {:value => "", :id => "company_name"}, :label => "company name" %>

в это:

<div class="input string required">
    <label for="company_name" class="string required">
    <abbr title="required">*</abbr> company name</label>
    <input type="text" value="" size="50" required="required" name="lead[Company]" id="company_name" class="string required">
</div>

Донне нравится, что он оборачивает все в DIV и добавляет элемент ABBR к партии.

Как я могу предотвратить это?

Ответы [ 11 ]

47 голосов
/ 05 октября 2011

Вы можете просто установить необходимую метку на пустое значение в файле локали simple_form:

en:
  simple_form:
    required:
      text: 'required'
      mark: '*'

Или используйте CSS, чтобы скрыть это.

33 голосов
/ 02 января 2013

В config / initializer / simple_form.rb добавьте эту строку:

config.label_text = lambda { |label, required| "#{label}" }
20 голосов
/ 04 октября 2011

Я использую Rails 3.1, и у меня есть следующий код вида в моем _form.html.erb для данной модели:

<div>
  <%= f.label :full_name %><br/>
  <%= f.text_field :full_name, :required => true %><br/>
</div>

На этикетке не отображается звездочка, если вы делаете это таким образом. Если вы не отправите код, я не могу быть уверен в том, какой у вас подход и подходит ли мое решение для указанного подхода.

Обновленный ответ: Похоже, вы унаследовали этот код от кого-то. В любом случае, прочитав пример кода, вы наверняка используете гем simple_form. Информацию об этом драгоценном камне можно найти здесь https://github.com/plataformatec/simple_form. Чтобы ответить на ваш вопрос, если вы измените свой код следующим образом:

<%= f.input :Company, :input_html => {:value => "", :id => "company_name"}, :label => "company name", :required => false %>

Это должно выключить звездочку.

Я бы добавил, исходя из вашего отвращения к HTML, сгенерированному из simple_form, звучит так, как будто вам просто нужно покончить с гемом и переписать код формы с помощью помощников по умолчанию в Rails, которые можно прочитать здесь 1013 *http://guides.rubyonrails.org/form_helpers.html. В зависимости от размера кодовой базы, вам может быть лучше просто поглотить его и узнать, как использовать гем simple_form ради экономии времени, но если вы думаете, что у вас есть время, чтобы все это изменить , пойти на это.

15 голосов
/ 04 ноября 2014

Самый простой способ - это скрыть это с помощью css:

abbr[title="required"] {
  display: none;
}
5 голосов
/ 05 октября 2011

Это совсем не рельсы.Это драгоценный камень simple_form .Так что, если вы не хотите, чтобы все элементы обтекания не использовали simple_form.Используйте Rails форму помощники .Это было бы проще, чем настроить то, что вам не нравится.

3 голосов
/ 30 января 2015

Код, который помог мне решить проблему звездочки:

abbr[title="required"] {
  display: none;
}

Выбранный ответ и другие предложения с просьбой изменить HTML в файле локалей не помогут мне с последним гемом Simple_form.

3 голосов
/ 01 июня 2013

Для тех, кто использует Formtastic и имеет эту проблему, вы можете удалить звездочки, отредактировав файл конфигурации, который обычно app / config / initializers / formtastic.rb .

Изменить этострока: # Formtastic::SemanticFormBuilder.required_string = "(required)"

будет: Formtastic::SemanticFormBuilder.required_string = ""

Подробнее здесь .

2 голосов
/ 06 сентября 2017

Помимо глобальной конфигурации, предложенной в принятом ответе, вы можете передать required: false в качестве опции ввода или defaults: { required: false }, чтобы установить ее для всей формы.

0 голосов
/ 18 марта 2019

Вы можете удалить его из всей формы:

<%= simple_form_for @form, defaults: { required: false } do |f| %>
0 голосов
/ 11 августа 2014

Вы можете использовать form_for и метод переопределения def label в config/initializer, чтобы добавить звездочку для обязательных полей следующим образом:

def label(object_name, method, content_or_options = nil, options = nil, &block)
    if content_or_options.is_a?(Hash)

      content_or_options.each do |key, val|
        options[key] = val
      end

      content_or_options = method.to_s
    end

    content_or_options ||= method.to_s

    presence_validations = [ActiveModel::Validations::PresenceValidator, ActiveRecord::Validations::PresenceValidator]

    class_obj = options[:object].class if options[:object]
    class_obj ||= object_name.to_s.camelize.constantize

    validations = class_obj.validators_on(method.to_s).map(&:class)

    if (presence_validations.map { |pv| validations.include?(pv) }).any?
      content_or_options += "*"
    end

    Tags::Label.new(object_name, method, self, content_or_options, options).render(&block)
end

Этот метод ставит звездочку после всех обязательных полей, если выиспользуется нормально form_for, а используется validates_presence_of

...