2010-11-28 56 views
6

Je suis relativement nouveau sur Rails et un peu surpris ce n'est pas un comportement configurable ... du moins pas celui que j'ai pu trouver pour le moment?!? J'aurais pensé que 99% des formulaires bénéficieraient de blancs de tous les champs string & text?!? J'imagine que je me trompe ...Rails 3 strip whitespace before_validation sur tous les formulaires

Peu importe, je suis à la recherche d'un moyen DRY de supprimer tous les espaces des champs de formulaire (de type: string &: text) dans une application Rails 3.

Les vues ont des aides qui sont automatiquement référencés (inclus?) Et disponibles pour chaque vue ... mais les modèles ne semblent pas avoir une telle chose?!? Ou ils le font?

donc actuellement je faire ce qui suit qui premiernécessite et alorscomprend le whitespace_helper (aka WhitespaceHelper). mais cela ne semble toujours pas très sec pour moi, mais ça marche ...

ClassName.rb:

require 'whitespace_helper' 

class ClassName < ActiveRecord::Base 
    include WhitespaceHelper 
    before_validation :strip_blanks 

    ... 

    protected 

    def strip_blanks 
    self.attributeA.strip! 
    self.attributeB.strip! 
    ... 
    end 

lib/whitespace_helper.rb:

module WhitespaceHelper 
    def strip_whitespace 
    self.attributes.each_pair do |key, value| 
    self[key] = value.strip if value.respond_to?('strip') 
    end 
end 

Je suppose que je suis Vous recherchez une méthode (DRY) unique (classe?) pour mettre quelque part (lib/?) qui prendrait une liste de paramètres (ou d'attributs) et supprimerait les espaces (.strip!?) de chaque attribut sans nom spécifique.

+0

double possible de [est-il une bande ignée à utiliser sur tous: params lors de la création d'un nouveau modèle dans Rails] (http://stackoverflow.com/questions/4272028/is-there-a- dry-way-to-use-strip-on-all-params-lors de la création d'un nouveau modèle-dans-rails) –

+0

Vous pouvez le mettre dans une aide et l'inclure dans votre modèle –

+0

Merci, mais cela ne semble que pour travailler si d'abord 'require whitespace_helper' et ensuite' inclure WhitespaceHelper' dans le même fichier. Comment est ce DRY? Semble redondant ... quelqu'un peut-il expliquer? – Meltemi

Répondre

7

Créer une aide before_validation comme on le voit here

module Trimmer 
    def trimmed_fields *field_list 
    before_validation do |model| 
     field_list.each do |n| 
     model[n] = model[n].strip if model[n].respond_to?('strip') 
     end 
    end 
    end 
end 

require 'trimmer' 
class ClassName < ActiveRecord::Base 
    extend Trimmer 
    trimmed_fields :attributeA, :attributeB 
end 
+0

Pourquoi définissez-vous tout simplement pas la méthode sur Trimmer et 'prolongez Trimmer' dans la classe? –

+1

@Semyon juste convention, cela fonctionnerait aussi bien. De cette façon, vous pouvez inclure des assistants d'instance et de classe dans le même module. J'ai mis à jour l'exemple pour utiliser 'ActiveSupport :: Concern' qui est beaucoup plus facile à lire. –

+1

Meh, 'ActiveSupport :: Concern' est cool, mais étendre est plus simple dans ce cas. –

0

Notez que je ne l'ai pas essayé et il serait peut-être une idée folle, mais vous pouvez créer une classe comme ceci:

MyActiveRecordBase < ActiveRecord::Base 
    require 'whitespace_helper' 
    include WhitespaceHelper 
end 

. .. et ensuite hériter de vos modèles à partir de cela au lieu de AR :: Base:

MyModel < MyActiveRecordBase 
    # stuff 
end 
1

U Voir le AutoStripAttributes gem for Rails. cela vous aidera à accomplir facilement et proprement la tâche.

class User < ActiveRecord::Base 
# Normal usage where " aaa bbb\t " changes to "aaa bbb" 
    auto_strip_attributes :nick, :comment 

    # Squeezes spaces inside the string: "James Bond " => "James Bond" 
    auto_strip_attributes :name, :squish => true 

    # Won't set to null even if string is blank. " " => "" 
    auto_strip_attributes :email, :nullify => false 
end