tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby

ruby-on-rails - que - ruby on rails tutorial



Si la cadena está vacía, devuelve un valor predeterminado (5)

A menudo necesito verificar si algún valor está en blanco y escribir "No hay datos presentes" como ese:

@user.address.blank? ? "We don''t know user''s address" : @user.address

Y cuando tenemos alrededor de 20-30 campos que necesitamos procesar de esta manera, se vuelve feo.

Lo que he hecho es una clase String extendida con or método

class String def or(what) self.strip.blank? ? what : self end end @user.address.or("We don''t know user''s address")

Ahora se ve mejor. Pero todavía es crudo y áspero

¿Cómo sería mejor resolver mi problema? Tal vez sería mejor extender la ActiveSupport class o usar el método helper o mixins o cualquier otra cosa. Lo que la idealogía de rubí, tu experiencia y tus mejores prácticas pueden decirme.


¿ActiveSupport agrega un método de presence a todos los objetos que devuelve su receptor si está present? (¿lo opuesto a blank? ), y nil caso contrario.

Ejemplo:

host = config[:host].presence || ''localhost''


Phrogz me dio la idea en el comentario de PofMagicfingers, pero ¿qué pasa con la anulación? ¿en lugar?

class String def |(what) self.strip.blank? ? what : self end end @user.address | "We don''t know user''s address"


Probablemente sea mejor extender ActiveRecord o modelos individuales en lugar de String.

En su opinión, es posible que prefiera un patrón más explícito como

@user.attr_or_default :address, "We don''t know the user''s address"


Su o el método puede tener algunos efectos secundarios no deseados, ya que el valor alternativo (predeterminado) siempre se evalúa, incluso si la cadena no está vacía.

Por ejemplo

@user.address.or User.make_a_long_and_painful_SQL_query_here

haría un trabajo extra, incluso si la dirección no está vacía. Tal vez podrías actualizar eso un poco (perdón por la confusión de un trazador de líneas, tratando de mantenerlo corto):

class String def or what = "" self.strip.empty? ? block_given? ? yield : what : self end end @user.address.or "We don''t know user''s address" @user.address.or { User.make_a_long_and_painful_SQL_query_here }


Ya que estás haciendo esto en Ruby on Rails, parece que estás trabajando con un modelo. Si quería un valor predeterminado razonable en todas partes de su aplicación, podría (por ejemplo) anular el método de address para su modelo de User .

No conozco ActiveRecord lo suficientemente bien como para proporcionar un buen código para esto; en Sequel sería algo así como:

class User < Sequel::Model def address if (val=self[:address]).empty? "We don''t know user''s address" else val end end end

... pero para el ejemplo anterior, parece que estaría mezclando la lógica de visualización en su modelo, lo cual no es una buena idea.