2010-11-28 19 views
6

私は比較的新しいRailsですが、これは設定可能な動作ではないことに驚きました...少なくとも私がまだ見つけられていないものは何ですか?私は、フォームの99%がすべて空白から切り取られて利益を得ると思っていたでしょうstring & textフィールド?!?私は間違っていると思います...Rails 3空白のbefore_validationはすべてのフォームで空白

私は、Rails 3アプリでフォームフィールド(タイプ:文字列&:テキスト)からすべての空白を取り除くDRY方法を探しています。

ビューには、自動的に参照される(含まれていますか?)ビューアごとに利用可能なヘルパーがありますが、モデルにはそのようなことはありませんか?それとも彼らは?

だから現在私が最初が含ま whitespace_helper(別名WhitespaceHelper)を、その後を必要とする次の操作を行います。しかし、これはまだ私には非常に乾燥していないようですが、それは動作します...

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 

私は思いますよ(lib/?)を指定して、パラメタ(または属性)のリストを取得し、特に指定された各属性の空白(.strip!?)を削除する単一の(DRY)メソッド(クラス?)を探しています。

+0

可能複製(http://stackoverflow.com/questions/4272028/is-there-a-新しいモデルインレールを作成する際には、ドライウェイトゥオールパルプを使用してください) –

+0

ヘルパーに入れてモデルに組み込むことができます –

+0

ありがとうございます最初に 'whitespace_helper'を必要とし、' WhitespaceHelper'を同じファイルにインクルードすると動作します。このDRYはどうですか?冗長なようだ...誰か説明することができますか? – Meltemi

答えて

7

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

#もの 終わり? –

+1

@Semyonちょうど大会でも、それはうまくいくでしょう。このようにして、インスタンスとクラスヘルパーを同じモジュールに含めることができます。私は、ActiveSupport :: Concernを使用するようにサンプルを更新しました。これは読みやすくなりました。 –

+1

Meh、 'ActiveSupport :: Concern'はクールですが、この場合は拡張が簡単です。 –

0

注意としてbefore_validationヘルパーを作成します。私はこれを試していない、それはクレイジーなアイデアかもしれませんが、あなたはこのようなクラスを作成できます。

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

を。 ..あなたのモデルをAR :: Baseの代わりに継承してください:

MyModel < MyActiveRecordBase 
    # stuff 
end 
1

U AutoStripAttributes gem for Railsをご覧ください。それはあなたが簡単かつきれいに仕事を達成するのに役立ちます。

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 
[すべてにストリップを使用するDRY方法はありますか?:Railsの中に新しいモデルを作成する際にparamsは]の
関連する問題