我是Ror初学者。有一个模型 Lectur e,我想首先验证开始时间和结束时间的格式,然后检查结束时间是否在开始时间之后。它在格式有效时效果很好但是一旦格式错误就会出现:未定义的方法`<'为零:NilClass。如何在格式有效时触发 start_must_be_before_end_time ?谢谢!
以下是代码:
class Lecture < ActiveRecord::Base
belongs_to :day
belongs_to :speaker
validates :title, :position, presence: true
validates :start_time, format: { with: /([01][0-9]|2[0-3]):([0-5][0-9])/,
message: "Incorrect time format" }
validates :end_time, format: { with: /([01][0-9]|2[0-3]):([0-5][0-9])/,
message: "Incorrect time format" }
validate :start_must_be_before_end_time
private
def start_must_be_before_end_time
errors.add(:end_time, "is before Start time") unless start_time < end_time
end
end
答案 0 :(得分:2)
validates
方法定义的验证顺序无法保证。但是,使用validate
方法定义的custom validators保证订单。
来自docs:
您可以为每个类方法传递多个符号,相应的验证将以与注册时相同的顺序运行。
如果所有其他验证都通过,则只能运行验证方法:
validate :start_must_be_before_end_time, :unless => Proc.new { |obj| obj.times_valid? }
# Then, define `times_valid?` method and check that start_time and end_time are valid
答案 1 :(得分:-1)
你可以采取另一种方式:
theBoard = {1:' ', 2:' ', 3:' ', 4: ' ', 5:' ', 6: ' ', 7:' ', 8:' ', 9:' '}
@app.route('/reset', methods=["GET", "POST"])
def reset():
for i in range (1,9):
theBoard[i] == ' '
return render_template("test.html", theBoard=theBoard)
@app.route('/play', methods=["GET","POST"])
def test1():
return render_template("test.html", theBoard=theBoard)
@app.route('/play1', methods=["GET", "POST"])
def test():
if gameover(theBoard):
True
return 'the game is over1'
else:
x = request.form['move']
move = int(x)
valid_moves = [1,2,3,4,5,6,7,8,9]
if move not in valid_moves:
return 'you did not specify a valid move, please try again!'
elif theBoard[move] != ' ':
return 'you can not play that space, it is taken'
else:
theBoard[move] = 'X'
if gameover(theBoard):
True
return 'the game is over2'
if winning_X(theBoard):
<and much more code - this part works>