1

ユーザーがイベントを作成できるページを作成しようとしています。最初にイベントを保存できるようにしてほしいと思います。これにより、イベントはデータベースに保存されますが、他のユーザーには表示されなくなります。また、ユーザーがイベントを公開できるようにしたいと考えています。これにより、ユーザーが変更を加えることを防ぎ、他のユーザーがそれを見ることができるようになります。

イベント作成フォームに「保存」ボタンと「公開」ボタンの両方を配置することで、これを行う予定でした。保存するということはまだ不完全であることを意味するので、このボタンがクリックされたときは何も検証する必要はありませんが、「公開」ボタンがクリックされたときは検証を行います。

event.rb の次のコードでこれを達成しようとしましたが、いずれかのボタンをクリックすると検証が実行されます。

with_options :if => :published? do
  validates_date :date, presence: true, :after => Time.now, :after_message => 'must be in the future'
  validates_time :time, presence: true
end

def published?
  :published == "true"
end

:published は、公開ボタンがクリックされたときにのみ "true" になる必要があることを確認しました。(ユーザーが「公開」をクリックすると、JSを介してevent [published]をtrueに設定しています。それ以外の場合はデフォルトでfalseになります。)

検証が常に実行されている理由は何ですか?

編集:これが機能しなかった理由はまだわかりませんが、次のように、各検証句を個別にチェックすると、期待どおりに機能することがわかりました。

validates_date :date, presence: true, :after => lambda { Time.now }, :after_message => 'must be in the future', :if => :published?
validates_time :time, presence: true, :if => :published?
4

1 に答える 1

2

ここでタイプミスがあるかもしれません:published=="true"の代わりにpublished=="true"を使用してください

def published?
    self.published == "true"
end

また、(:after => Time.now)を使用していることに気づきました。生産では、このラインは一度だけ評価されると思います。したがって、ラムダを使用して、検証時にTime.nowが常に呼び出されるようにすることができます。

于 2012-12-16T19:11:41.313 に答える