42

When I add the 'Required' attribute
to html input fields, Rails pre-pends an asterisk (*) before the label.

Does anyone know how to prevent this?

For some reason Rails transforms this:

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

into this:

<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>

I don't like that it wraps everything in a DIV and adds an ABBR element to the party.

How can I prevent this?

vsync
  • 118,978
  • 58
  • 307
  • 400

11 Answers11

52

You can just set the required mark to empty value in simple_form's locale file:

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

Or use CSS to hide it.

RocketR
  • 3,626
  • 2
  • 25
  • 38
35

In config/initializers/simple_form.rb add this line:

config.label_text = lambda { |label, required| "#{label}" }
Shane Andrade
  • 2,655
  • 17
  • 20
  • 1
    I had to both uncomment the line from the initializer field and change html: '' in the yaml file in my locales directory. FWIW, I am using simple_form with devise and bootstrap. Don't know or thinks that makes a difference though – shicholas Feb 06 '13 at 22:06
  • I've tried the locale solution and didn't work, but this one did. I'm using simple_form 2.0.4 – Mauro Verón Sep 13 '13 at 22:14
  • 6
    Using 3.0-RC2, I used this: config.label_text = lambda { |label, required, explicit_label| "#{label}" } – JosephK Jul 20 '14 at 02:47
  • Still not working for me. With devise 3.0.3, Rails 3.2.13, no chance, the `config.label_text` is completely ignored. – Ain Tohvri Jul 27 '14 at 13:41
  • Remember you need to restart your Rails server after editing an initializer file. – Dan Weaver Feb 14 '15 at 01:47
  • 2
    Is it possible remove the asterisk on a per-form basis? – art-solopov Nov 08 '16 at 15:36
  • @art-solopov for that I just pass `defaults: { required: false }` as a form option. – inopinatus Sep 05 '17 at 22:18
  • 2
    The following works with SimpleForm 3.5.0: `lambda { |label, required, explicit_label| "#{label}" }`. Note the inclusion of the `explicit_label` argument. – Luke Keller Jan 26 '18 at 19:48
22

I'm using Rails 3.1, and I have the following view code in my _form.html.erb for a given model:

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

The label does not show an asterisk if you do it this way. Unless you post code I can't be sure of what your approach is and if my solution would fit said approach.

Updated Answer: It sounds like you've inherited this code from someone. At any rate, after reading your code sample, you are most definitely using the simple_form gem. Information about that gem can be found here https://github.com/plataformatec/simple_form. To answer your question though, if you change your code the following:

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

That should turn off the asterisk.

I would add, based on your disgust for the HTML generated from simple_form, it sounds like you should just do away with the gem and re-write your form code using the Rails default form helpers, which can be read about here http://guides.rubyonrails.org/form_helpers.html. Depending on the size of the code base, you might be better off just sucking it up and learning how to use the simple_form gem for the sake of saving time, but if you think you have the time to change it all, go for it.

Lester Peabody
  • 1,868
  • 3
  • 20
  • 42
  • thanks, I will try splitting it. currently I use it as one line combined, maybe cause of that. – vsync Oct 04 '11 at 17:11
  • No problem, if this worked for you make sure to upvote and mark it as the accepted answer so other folks can benefit. – Lester Peabody Oct 04 '11 at 22:02
  • I don't understand, for some reason RoR thinks all fields are require by default – vsync Oct 05 '11 at 09:20
  • @vsync: I've updated my answer to reflect the code you provided in your updated answer. This should be all that you need, let me know if you need additional help. – Lester Peabody Oct 05 '11 at 16:40
  • 1
    I up-voted for this answer, and will have to verify it only next week when the other developer in my office comes back. – vsync Oct 06 '11 at 15:32
  • I figured you didn't downvote it as I was trying to help :) someone else did though... *shakes fist* – Lester Peabody Oct 06 '11 at 15:51
16

The simplest way is to hide it with this css:

abbr[title="required"] {
  display: none;
}
VoA
  • 503
  • 1
  • 6
  • 16
5

It isn't rails at all. It's the simple_form gem. So, if you don't want all the wrapping elements don't use simple_form. Use Rails form helpers. It would be more simple than customize something you don't like.

lucapette
  • 20,564
  • 6
  • 65
  • 59
  • But what if you want to use simple_form and just want to disable the asterisk? Most people who come to this question are probably using simple_form and want to keep it – Metaphysiker Oct 25 '18 at 14:54
4

For anyone using Formtastic and having this issue, you can remove the asterisks by editing the config file, which is typically app/config/initializers/formtastic.rb.

Change this line: # Formtastic::SemanticFormBuilder.required_string = "(required)"

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

More info here.

Aaron Gray
  • 11,283
  • 7
  • 55
  • 61
3

Code that has helped me solve the asterisk issue:

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

The chosen answer and the other suggestions asking to change the HTML in locales file dint help me with the latest Simple_form gem.

Cybergenie
  • 79
  • 6
3

Aside from the global config suggested in the accepted answer, you can pass required: false as an input option, or defaults: { required: false } to set it for the whole form.

inopinatus
  • 3,597
  • 1
  • 26
  • 38
  • Others already said this in [answers](https://stackoverflow.com/a/7651132/104380) from 6 years ago.. you do not provide any new insights to this old matter.. – vsync Sep 06 '17 at 10:45
  • Yes I did: how to set it for the whole form. My answer is also very brief, which is good. – inopinatus Sep 06 '17 at 11:23
  • That is true, the part where you mention the `defaults` is indeed fresh information – vsync Sep 06 '17 at 12:42
3

You can remove it from the whole form:

<%= simple_form_for @form, defaults: { required: false } do |f| %>
FrankfromDenmark
  • 170
  • 2
  • 12
0

I found out that if you only want to remove the asterisk(*) behind it then all you have to do is to go to this file file /config/locales/simple_form.en.yml

once again is not a good practice to change your configuration files for gems and something your using for some reason, it always a question of why do you really use simple_form!

But for example I found out about that because there is great things about simple_form we use but nowadays is a better usability practice to have the asterisks on none required fields then required ones.

Nikhil
  • 16,194
  • 20
  • 64
  • 81
andre.orvalho
  • 1,034
  • 2
  • 11
  • 17
0

you can used form_for, and override method def label in config/initializer to add asterisk for mandatory fields as the following:

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

This method puts asterisk after all mandatory fields, if you used normal form_for, and used validates_presence_of

Mohamed Yakout
  • 2,868
  • 1
  • 25
  • 45