2011-10-04 4 views
31

Quando aggiungo l'attributo 'Richiesto'
ai campi di input html, Rails pre-pende un asterisco (*) prima dell'etichetta.Come disabilitare l'asterisco sui campi obbligatori del modulo?

Qualcuno sa come prevenirlo?

Per qualche ragione Rails trasforma questa:

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

in questo:

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

Non mi piace che avvolge tutto in un DIV e aggiunge un elemento ABBR al partito.

Come posso evitare questo?

+4

Puoi per favore pubblicare il codice di cui stai parlando? Ciò aiuterebbe. –

+0

@Lester Peabody - Ho aggiornato la domanda con il mio esempio di codice – vsync

+2

Stai usando gemme come 'formtastic' o' simple_form'? Per favore pubblica il tuo 'Gemfile'. – htanata

risposta

27

in config/inizializzatori/simple_form.rb aggiungere questa riga:

config.label_text = lambda { |label, required| "#{label}" } 
+1

Ho dovuto rimuovere il commento dalla riga dal campo inizializzatore e modificare html: '' nel file yaml nella mia directory locales. FWIW, sto usando simple_form con Devise e Bootstrap. Non so o penso che faccia la differenza anche se – shicholas

+0

ho provato la soluzione locale e non ha funzionato, ma questo ha fatto. Sto usando simple_form 2.0.4 –

+6

Usando 3.0-RC2, ho usato questo: config.label_text = lambda {| label, required, explicit_label | "# {label}"} – JosephK

18

sto usando Rails 3.1, e ho il seguente codice della vista nel mio _form.html.erb per un determinato modello:

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

L'etichetta non mostra un asterisco se lo si fa in questo modo . A meno che non si inserisca il codice non posso essere sicuro di quale sia il tuo approccio e se la mia soluzione si adatta a tale approccio.

Risposta aggiornata: Sembra che tu abbia ereditato questo codice da qualcuno. In ogni caso, dopo aver letto il tuo esempio di codice, utilizzerai sicuramente la gemma simple_form. Informazioni su quella gemma possono essere trovate qui https://github.com/plataformatec/simple_form. Per rispondere alla tua domanda, però, se si modifica il codice seguente:

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

Questo dovrebbe spegnere l'asterisco.

Vorrei aggiungere, basandoti sul tuo disgusto per l'HTML generato da simple_form, sembra che dovresti solo eliminare la gemma e riscrivere il codice del tuo form usando gli helper del modulo di default di Rails, che possono essere letti qui http://guides.rubyonrails.org/form_helpers.html. A seconda delle dimensioni della base di codice, potresti stare meglio a succhiarlo e imparare a usare la gemma simple_form per risparmiare tempo, ma se pensi di avere il tempo di cambiarlo tutto, fallo.

+0

grazie, proverò a dividerlo. attualmente lo uso come una linea combinata, forse a causa di ciò. – vsync

+0

Nessun problema, se questo ha funzionato per te assicurati di andare avanti e contrassegnarlo come risposta accettata in modo che altre persone possano trarne beneficio. –

+0

Non capisco, per qualche motivo RoR pensa che tutti i campi siano obbligatori per impostazione predefinita – vsync

5

Non è affatto binari. È la gemma simple_form. Quindi, se non vuoi che tutti gli elementi di wrapping non utilizzino simple_form. Utilizzare il modulo Rails helpers. Sarebbe più semplice di personalizzare qualcosa che non ti piace.

45

Si può solo impostare il marchio richiesto a valore vuoto nel file di localizzazione di simple_form:

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

Oppure utilizzare i CSS per nasconderlo.

+0

creerebbe un elemento html vuoto? perché sarebbe un risultato altamente indesiderato. – vsync

+10

Questo non funziona più - ora devi decommentare la linea "html" sotto (o aggiungerla se non la hai già), quindi impostarla su 'html: ''' – DaveStephens

+2

Questa è la risposta !, Nel caso in cui qualcuno si chieda, dovresti creare un nome file simple_form.en.yml sotto config/locales/ – jlstr

0

ho scoperto che se si desidera rimuovere l'asterisco (*) dietro allora tutto quello che dovete fare è andare a questo file file /config/locales/simple_form.en.yml

ancora una volta non è una buona pratica di cambiare i file di configurazione per le gemme e qualcosa che usi per qualche ragione, è sempre una questione di perché usi veramente simple_form!

Ma per esempio l'ho scoperto perché ci sono grandi cose su simple_form che usiamo, ma oggi è una pratica di usabilità migliore per avere gli asterischi su nessuno campi obbligatori quindi quelli obbligatori.

3

per chiunque utilizzi Formtastic e avendo questo problema, è possibile rimuovere gli asterischi modificando il file di configurazione, che in genere è app/config /initializers/formtastic.rb.

Modifica questa linea: # Formtastic::SemanticFormBuilder.required_string = "(required)"

di essere: Formtastic::SemanticFormBuilder.required_string = ""

Maggiori informazioni here.

0

è possibile utilizzare form_for, e il metodo def label ignorare in config/initializer aggiungere asterisco per i campi obbligatori come il seguente:

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 

Questo metodo mette asterisco dopo che tutti i campi obbligatori, se è stato utilizzato il normale form_for, e utilizzato validates_presence_of

11

Il modo più semplice è quello di nasconderlo con questo css:

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

questo ha funzionato bene per me. – Andreas

+0

@Andreas Bello e semplice vince la gara. Sono contento che ci abbia aiutato. – VoA

3

codice che mi ha aiutato a risolvere il problema asterisco:

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

La risposta scelto e gli altri suggerimenti che chiedono di modificare il codice HTML in file di locali furia aiutarmi con l'ultima gemma Simple_form.

+1

dove si aggiunge questo codice, in una configurazione bootstrap simple_form? Thx – user553620

1

Oltre alla configurazione globale suggerita nella risposta accettata, è possibile passare required: false come opzione di input o defaults: { required: false } per impostarlo per l'intero modulo.

+0

Gli altri hanno già detto questo in [risposte] (https://stackoverflow.com/a/7651132/104380) di 6 anni fa .. non fornisci nuove intuizioni a questa vecchia materia .. – vsync

+0

Sì, ho fatto: come per impostarlo per l'intero modulo. La mia risposta è anche molto breve, il che è positivo. – inopinatus

+0

Questo è vero, la parte in cui si menziona il 'defaults' è in effetti una nuova informazione – vsync