Mi capita di utilizzare jQuery nei miei progetti, quindi quando voglio alcune funzionalità come questa, di solito uso qualcosa come labelify. Quindi, userei qualcosa come <%= f.text_field :slug, :title => generate_slug(6) %>
. (Suggerimento, non è necessario inserire la chiamata #generate_slug all'interno di una stringa se restituisce qualcosa che si risolve in una stringa da sola, anzi è più performante se non lo fai.)
Se si non voglio andare con l'approccio jQuery, potresti voler avvolgere questo pezzo di logica nel tuo modello.
def Content < ActiveRecord::Base
def slug
self.new_record? ? self.slug_for_new_record : attributes[:slug]
end
private
def slug_for_new_record
# I don't know what you're doing in generate_slug, but it sounds model-
# related, so if so, put it here and not in a helper
end
end
Se appartiene realmente nella vista, ancora un'altra opzione è quella di rendere il vostro proprio rubino un po 'più conciso (dovrete giudicare se questo è più leggibile):
<%= f.text_field :slug, :value => (generate_slug(6) if @content.new_record?) %>
Non dimenticare i parenti che circondano lo (generate_slug(6) if @content.new_record?)
. Se lo fai, lo if
verrà applicato a text_field, che non è quello che desideri.
Ma ci sono ancora altri modi per farlo. La riga di codice sopra non è eccezionale se la tua logica potrebbe cambiare e stai incollando questo codice su tutto il tuo progetto di rotaie.Quando volevo aggiungere una classe 'required' ai miei campi di testo, ma solo se erano un nuovo record (avevamo alcuni dati legacy che non volevamo far pulire le persone), ho creato il mio builder con un required_field
metodo che ha appena chiamato text_field
e ha aggiunto una classe 'richiesta' se l'elemento era un nuovo record. Questo potrebbe sembrare un lavoro, ma abbiamo circa 20 diverse forme, ognuna con potenzialmente più campi obbligatori, ed è molto più facile cambiare la logica aziendale in un unico posto. Quindi, se pensi davvero che questa logica appartenga alla vista ma hai un sacco di queste righe di codice e non vuoi doverle modificare in un milione di posti, allora FormBuilder è la strada da percorrere. Penso che questo sia nella maggior parte dei casi più carino e più appropriato di un aiutante, ma, di nuovo, la bellezza è negli occhi di chi guarda. Ecco il mio codice di un po 'adattato per il vostro caso:
# config/environment.rb
ActionView::Base.default_form_builder = NamespacesAreFun::FormBuilder
# lib/namespaces_are_fun/form_builder.rb
module NamespacesAreFun
class FormBuilder < ActionView::Helpers::FormBuilder
def slug_field(method, options = {})
opts = options.to_options
opts.merge!(:value => generate_slug) if self.object.new_record?
text_field(method, opts)
end
end
end
# views/.../your_view.html.erb
<%= f.slug_field :slug %>
Speriamo che in tutti questi diversi approcci è uno che misura il vostro progetto.
Questo sembra fantastico. Come posso rendere il mio aiuto accessibile all'interno del controller? (generate_slug (6) è un helper). Ricevo 'metodo non definito' generate_slug 'per # ' –
jyoseph
Scratch che, l'ho aggiunto come azione privata nel controller Contents. Non mi preoccupare! Grazie per la risposta! – jyoseph
Come notato da carpeliam, a seconda di come e quanto spesso si utilizzerà questa funzionalità, si potrebbe voler inserire il modello come metodo ('def slug; | sl = generate_slug (6); end) . –