Yo uso jQuery en mis proyectos, así que cuando quiero algunas funcionalidades como esta, suelo usar algo como labelify. Entonces, usaría algo como <%= f.text_field :slug, :title => generate_slug(6) %>
. (Consejo importante, no es necesario colocar la llamada #generate_slug dentro de una cadena si devuelve algo que se resolverá en una cadena por sí mismo, de hecho es más eficiente si no lo hace).
Si No quiero ir con el enfoque de jQuery, es posible que desee envolver esta pieza lógica en su modelo.
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
Si realmente pertenece en la vista, otra opción es simplemente hacer su rubí un poco más concisa (que tendrá que juzgar si esto es más fácil de leer):
<%= f.text_field :slug, :value => (generate_slug(6) if @content.new_record?) %>
No olvides los parientes que rodean al (generate_slug(6) if @content.new_record?)
. Si lo hace, el if
se aplicará al campo de texto, que no es lo que desea.
Pero todavía hay más formas de hacerlo. La línea de código anterior no es excelente si su lógica puede cambiar y está pegando este código en todo su proyecto de rieles.Cuando quería agregar una clase 'requerida' a mis campos de texto, pero solo si eran un registro nuevo (teníamos algunos datos heredados que no queríamos que la gente limpiara), creé mi propio creador de formularios con un required_field
método que acaba de llamar text_field
y agregó una clase 'requerida' si el elemento era un nuevo registro. Esto puede parecer un trabajo, pero tenemos alrededor de 20 formularios diferentes, cada uno con múltiples campos requeridos, y es mucho más fácil cambiar la lógica de negocios en un solo lugar. Entonces, si realmente crees que esta lógica pertenece a la vista, pero tienes muchas de estas líneas de código y no quieres tener que cambiarla en un millón de lugares, entonces FormBuilder es el camino a seguir. Creo que esto es en la mayoría de los casos más bonito y más apropiado que un ayudante, pero, de nuevo, la belleza está en el ojo del espectador. Aquí está mi código algo adecuado para su 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 %>
Esperemos que en todos estos diferentes enfoques es uno que se adapte a su proyecto.
Esto se ve increíble. ¿Cómo puedo hacer que mi ayudante sea accesible dentro del controlador? (generate_slug (6) es un ayudante). Obtengo el método 'undefined' generate_slug 'para # ' –
jyoseph
Scratch that, lo agregué como una acción privada en el controlador de contenido. ¡No me importa! ¡Gracias por la respuesta! – jyoseph
Según lo observado por carpeliam, dependiendo de cómo y con qué frecuencia va a utilizar esta funcionalidad, es posible que desee incluir el modelo como un método ('def slug; slug || = generate_slug (6); end) . –