3 Stimmen

Was ist die beste Praxis Ort, um Formulardaten vor dem Speichern in Rails 3 zu manipulieren?

Was ist der beste Ort, um Formulardaten vor dem Speichern zu manipulieren, wenn es um bewährte Rails-Verfahren geht?

In einem Kontaktformular möchte ich zum Beispiel sicherstellen, dass alle Daten in Großbuchstaben gespeichert werden (hassen Sie es nicht auch, wenn die Leute bei der Übermittlung des Formulars "Bitte kontaktieren Sie mich" schreien?) )

  • Ist es besser, die Manipulation im Controller durchzuführen? Ich könnte entweder tun es in erstellen, oder verschieben Sie es in eine Art von privaten Methode, die alle String-Attribute des Objekts vor dem Speichern / Aktualisieren großschreiben wird?

Oder

  • Ist es besser, im Modell vor dem Speichern zu speichern? Ich halte es für sinnvoll, dies im Modell zu tun, da ich wahrscheinlich möchte, dass dies für alle Datensätze gleich ist, unabhängig davon, ob ich sie in einer Rake-Aufgabe oder über die Weboberfläche bearbeite.

Bonus:

Auch wo würde ich es platzieren, wenn ich möchte, dass das auf alle meine Modelle, mit der Fähigkeit, Standard auf einer Fall-zu-Fall-Basis zu überschreiben? Anwendungscontroller? Es könnte einige Sonderfälle geben, in denen Sie den Wert ohne Großschreibung speichern möchten - z. B. Markennamen, die nicht großgeschrieben werden (z. B. utorrent) oder ein Nachname, der mehrere Großbuchstaben im Namen haben sollte (z. B. irische und schottische Namen wie McDonald)

Ich danke Ihnen!

4voto

Will Ayd Punkte 6486

Am einfachsten ist es, dies in Ihrem Modell unterzubringen. Ich würde vorschlagen, entweder before_save oder sogar before_validation zu verwenden, wenn Sie meinen, dass das besser passt. Etwas wie dies würde den Trick tun:

before_save :upcase_content

def upcase_content
  self.content = self.content.upcase
end

Wenn Sie darüber hinaus Ausnahmen von Fall zu Fall zulassen möchten, können Sie einen attr_accessor zu Ihrem Modell hinzufügen.

class MyModel < ActiveRecord::Base
attr_accessor :dont_upcase

before_save :upcase_content, :unless => :dont_upcase
...
end

Wenn Sie dann ein Modell erstellen, setzen Sie den Accessor auf true

@model = Model.new(:brand_name => utorrent)
@model.dont_upcase = true
@model.save!

3voto

jonnii Punkte 27657

Der beste Ort, um dies zu tun, ist in Ihrem Modell, so dass Sie ein dickes Modell und einen dünnen Controller haben, was eine "gute Sache" ist.

Wenn Sie möchten, dass dies für alle Ihre Modelle verfügbar ist, schlage ich vor, ein Modul zu verwenden, das Ihre gemeinsame Funktionalität enthält, und dieses dann in alle Modelle einzubinden, für die Sie das Standardverhalten verwenden möchten.

0voto

konung Punkte 6747

Ok, basierend auf den Vorschlägen der anderen Antworten habe ich diese Lösung gefunden:

lib/clean_strings.rb

module ActiveRecord
  class Base
    attr_accessor :dont_capitlize, :dont_strip

    before_save :_capitalize_strings, :unless => :dont_capitlize
    before_save :_strip_whitespaces,  :unless => :dont_strip

    def _capitalize_strings
      self.attributes.each_pair do |key, value|
        self[key] = value.capitalize if value.respond_to?('capitalize')
      end
    end

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

  end
end

in umwelt.rb hinzugefügt.

require "clean_strings"

Wann immer ich jetzt

@a.dont_capitalize = true
@a.save!

Es bereinigt sie vor dem Speichern nach meinen Regeln (Leerzeichen werden entfernt, aber nicht großgeschrieben). Natürlich braucht es mehr Feinabstimmung, aber ich denke, es ist ein guter Weg, um Formatregeln für alltägliche Dinge zu definieren. Auf diese Weise muss ich nicht jede einzelne Formulareingabe auf Dinge wie überflüssige Leerzeichen oder Leute, die nicht wissen, wo die Großbuchstaben-Taste ist, überprüfen!

Ich danke Ihnen allen für Ihre Beiträge (alle wurden hochgestuft).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X