私は同じテーブル(ID、タイトル、コンテンツ、ショート:ブール値、ユーザーID)とモデルを共有する2種類の投稿[long]と[short]を投稿できるようにしたいとします。要求が特定のコントローラから来た場合、レールの検証をカスタマイズするにはどうすればよいですか?
短い投稿を投稿することを選択し、サイトはコンテンツを保存し、それは120文字未満になります。それを認識するために、真実を示しますが、120未満の空のタイトルとコンテンツを許可するショートを選択した場合、 char .....など
私は同じテーブル(ID、タイトル、コンテンツ、ショート:ブール値、ユーザーID)とモデルを共有する2種類の投稿[long]と[short]を投稿できるようにしたいとします。要求が特定のコントローラから来た場合、レールの検証をカスタマイズするにはどうすればよいですか?
短い投稿を投稿することを選択し、サイトはコンテンツを保存し、それは120文字未満になります。それを認識するために、真実を示しますが、120未満の空のタイトルとコンテンツを許可するショートを選択した場合、 char .....など
最も簡単な方法は条件付きの検証です。あなたのモデルは次のようにする必要があります:私は右のあなたの例ではすべての条件を理解してわからないんだけど
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で条件付き検証の詳細を読むこともできます。
あなたがポストに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?
しかし、コントローラ側では、短い投稿用の新しいcountrollerを作成する必要があります。 – user5670731
いいえ、すべてのパラメータでオブジェクトを作成するだけです。検証によって残りの部分が実行されます –
それはバージョンをRailsのものに依存あなたが使う。最新バージョンでは、カスタム検証コンテキストを設定する可能性があります。 – MikDiet
しかし、より複雑なアプリケーションでは、フォームオブジェクトimhoを使用する方が良いです。 – MikDiet