Rails: как отключить звездочку в обязательных полях формы?

Когда я добавляю атрибут «Обязательный»
в поля ввода 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.

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


person vsync    schedule 04.10.2011    source источник
comment
Не могли бы вы опубликовать код, о котором вы говорите? Это поможет.   -  person Lester Peabody    schedule 04.10.2011
comment
@Lester Peabody - я обновил вопрос своим примером кода   -  person vsync    schedule 05.10.2011
comment
Используете ли вы драгоценные камни, такие как formtastic или simple_form? Пожалуйста, опубликуйте свой Gemfile.   -  person htanata    schedule 05.10.2011
comment
Если вы используете гем formtastic, вот как удалить звездочки.   -  person Aaron Gray    schedule 18.08.2016


Ответы (11)


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

config.label_text = lambda { |label, required| "#{label}" }
person Shane Andrade    schedule 02.01.2013
comment
Мне пришлось как раскомментировать строку из поля инициализатора, так и изменить html: '' в файле yaml в моем каталоге локалей. FWIW, я использую simple_form с devise и bootstrap. Не знаю или думает, что это имеет значение, хотя - person shicholas; 07.02.2013
comment
Я пробовал решение для локали и не сработало, но это сработало. Я использую simple_form 2.0.4 - person Mauro Verón; 14.09.2013
comment
Используя 3.0-RC2, я использовал это: config.label_text = lambda { |label, required, absolute_label| #{метка} } - person JosephK; 20.07.2014
comment
Все еще не работает для меня. С devise 3.0.3, Rails 3.2.13, никаких шансов, config.label_text полностью игнорируется. - person Ain Tohvri; 27.07.2014
comment
Помните, что вам нужно перезапустить сервер Rails после редактирования файла инициализатора. - person Dan Weaver; 14.02.2015
comment
Можно ли удалить звездочку на основе формы? - person art-solopov; 08.11.2016
comment
@art-solopov для этого я просто передаю defaults: { required: false } в качестве параметра формы. - person inopinatus; 06.09.2017
comment
С SimpleForm 3.5.0 работает следующее: lambda { |label, required, explicit_label| "#{label}" }. Обратите внимание на включение аргумента explicit_label. - person Luke Keller; 26.01.2018

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

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

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

person RocketR    schedule 05.10.2011
comment
это создаст пустой элемент html? потому что это был бы крайне нежелательный результат. - person vsync; 09.08.2012
comment
Это больше не работает — теперь вам нужно раскомментировать строку html внизу (или добавить ее, если у вас ее еще нет), а затем установить для нее значение html: ''. - person DaveStephens; 31.12.2012
comment
Это ответ! Если кому-то еще интересно, вы должны создать файл с именем simple_form.en.yml в config/locales/ - person jlstr; 22.03.2013
comment
Не нужно раскомментировать html, но вам нужно перезапустить сервер. - person Paul Alexander; 29.09.2014
comment
При таком подходе вы получаете пробелы: тег <abbr></abbr> все еще отображается. - person Undistraction; 10.07.2016

Я использую 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, о которых можно прочитать здесь http://guides.rubyonrails.org/form_helpers.html. В зависимости от размера кодовой базы вам может быть лучше просто смириться с этим и научиться использовать гем simple_form ради экономии времени, но если вы думаете, что у вас есть время все изменить, дерзайте.

person Lester Peabody    schedule 04.10.2011
comment
спасибо, попробую разбить. в настоящее время я использую его как одну линию, возможно, из-за этого. - person vsync; 04.10.2011
comment
Нет проблем, если это сработало для вас, обязательно проголосуйте и отметьте его как принятый ответ, чтобы другие люди могли получить пользу. - person Lester Peabody; 05.10.2011
comment
Я не понимаю, по какой-то причине RoR считает, что все поля обязательны по умолчанию - person vsync; 05.10.2011
comment
@vsync: я обновил свой ответ, чтобы отразить код, который вы предоставили в своем обновленном ответе. Это должно быть все, что вам нужно, дайте мне знать, если вам нужна дополнительная помощь. - person Lester Peabody; 05.10.2011
comment
Я проголосовал за этот ответ, и мне придется проверить его только на следующей неделе, когда вернется другой разработчик в моем офисе. - person vsync; 06.10.2011
comment
Я подумал, что вы не понизили его, так как я пытался помочь :) хотя кто-то другой сделал... трясет кулаком - person Lester Peabody; 06.10.2011

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

abbr[title="required"] {
  display: none;
}
person VoA    schedule 03.11.2014

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

person lucapette    schedule 05.10.2011
comment
Но что, если вы хотите использовать simple_form и просто хотите отключить звездочку? Большинство людей, которые приходят к этому вопросу, вероятно, используют simple_form и хотят сохранить его. - person Metaphysiker; 25.10.2018

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

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

to be: Formtastic::SemanticFormBuilder.required_string = ""

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

person Aaron Gray    schedule 31.05.2013

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

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

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

person Cybergenie    schedule 30.01.2015
comment
где можно добавить этот код в простой конфигурации начальной загрузки? Спасибо - person user553620; 09.10.2016

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

person inopinatus    schedule 05.09.2017
comment
Другие уже говорили об этом в ответах 6 лет назад. Вы не даете никаких новых идей по этому старому вопросу. - person vsync; 06.09.2017
comment
Да, я сделал: как установить его для всей формы. Мой ответ тоже очень краток, и это хорошо. - person inopinatus; 06.09.2017
comment
Это правда, та часть, где вы упоминаете defaults, действительно является свежей информацией. - person vsync; 06.09.2017

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

<%= simple_form_for @form, defaults: { required: false } do |f| %>
person FrankfromDenmark    schedule 18.03.2019

Я обнаружил, что если вы хотите удалить только звездочку (*) за ним, все, что вам нужно сделать, это перейти к этому файлу file /config/locales/simple_form.en.yml

еще раз, не рекомендуется изменять ваши файлы конфигурации для драгоценных камней и чего-то, что вы используете по какой-то причине, это всегда вопрос, почему вы действительно используете simple_form!

Но, например, я узнал об этом, потому что в simple_form есть замечательные вещи, которые мы используем, но в настоящее время удобнее использовать звездочки на необязательных полях, а не на обязательных.

person andre.orvalho    schedule 18.10.2012

вы можете использовать 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

person Mohamed Yakout    schedule 11.08.2014