2017-03-19 5 views
0

私は同じテーブル(ID、タイトル、コンテンツ、ショート:ブール値、ユーザーID)とモデルを共有する2種類の投稿[long]と[short]を投稿できるようにしたいとします。要求が特定のコントローラから来た場合、レールの検証をカスタマイズするにはどうすればよいですか?

短い投稿を投稿することを選択し、サイトはコンテンツを保存し、それは120文字未満になります。それを認識するために、真実を示しますが、120未満の空のタイトルとコンテンツを許可するショートを選択した場合、 char .....など

+0

それはバージョンをRailsのものに依存あなたが使う。最新バージョンでは、カスタム検証コンテキストを設定する可能性があります。 – MikDiet

+0

しかし、より複雑なアプリケーションでは、フォームオブジェクトimhoを使用する方が良いです。 – MikDiet

答えて

0

最も簡単な方法は条件付きの検証です。あなたのモデルは次のようにする必要があります:私は右のあなたの例ではすべての条件を理解してわからないんだけど

class Post < ActiveRecord::Base 
    validates :title, presence: true, unless: :short? 
    validates :title, absence: true, if: :short? 
    validates :content, presence: true 
    validates :content, length: { maximum: 120 }, if: :short? 
end 

、このコードは、あなたが欲しいものを作るのに十分であると思います。

Rails documentationで条件付き検証の詳細を読むこともできます。

0

あなたがポストにshortブールフィールドを持っているので、あなたは、単にこれらのヘルパーメソッドに

class Post < AR 
    # this method is automatically generated by rails 
    def short? 
    short 
    end 

    def long? 
    !short 
    end 
end 

を追加し、あなたの検証にif:またはunless:を追加することができます。

validates :content, length: { maximum: 120 }, if: :short? 
validates :content, presence: true, if: :long? 
+0

しかし、コントローラ側では、短い投稿用の新しいcountrollerを作成する必要があります。 – user5670731

+0

いいえ、すべてのパラメータでオブジェクトを作成するだけです。検証によって残りの部分が実行されます –

関連する問題