Используйте оператор while, пока пользователь не вводит истинное значение, и если входное значение не является числом или это значение null, пропустите его и попробуйте снова и так далее. В примере я попытался ответить на действительно ваш вопрос. Если мы предположим, что наш возраст составляет от 1 до 150, тогда принимается входное значение, иначе это неправильное значение. Для завершения программы пользователь может использовать клавишу 0 и вводить ее как значение.
Примечание: прочитайте комментарии вверху кода.
blockquote># If your input value is only a number then use "Value.isdigit() == False". # If you need an input that is a text, you should remove "Value.isdigit() == False". def Input(Message): Value = None while Value == None or Value.isdigit() == False: try: Value = str(input(Message)).strip() except InputError: Value = None return Value # Example: age = 0 # If we suppose that our age is between 1 and 150 then input value accepted, # else it's a wrong value. while age <=0 or age >150: age = int(Input("Please enter your age: ")) # For terminating program, the user can use 0 key and enter it as an a value. if age == 0: print("Terminating ...") exit(0) if age >= 18 and age <=150: print("You are able to vote in the United States!") else: print("You are not able to vote in the United States.")
Использование существующих свойств выполняется с помощью root или parent и довольно просто.
{
"rules": {
"things": {
// assuming value is being stored as an integer
".validate": "newData.val() <= root.child('max')"
}
}
}
Однако определение количества записей и их принудительное выполнение несколько сложнее, чем просто написать правило безопасности:
.length
on объект, нам нужно сохранить, сколько записей существует Наивный подход
. Один подход бедных людей, предполагая, что предел является чем-то небольшим (например, 5 записей), состоял бы в простом перечислении их в правилах безопасности:
{
"rules": {
"things": {
".write": "newData.hasChildren()", // is an object
"thing1": { ".validate": true },
"thing2": { ".validate": true },
"thing3": { ".validate": true },
"thing4": { ".validate": true },
"thing5": { ".validate": true },
"$other": { ".validate": false
}
}
}
Реальный пример
Такая структура данных, как это работает:
/max/<number>
/things_counter/<number>
/things/$record_id/{...data...}
Таким образом, каждый раз, когда добавляется запись , счетчик должен быть увеличен.
var fb = new Firebase(URL);
fb.child('thing_counter').transaction(function(curr) {
// security rules will fail this if it exceeds max
// we could also compare to max here and return undefined to cancel the trxn
return (curr||0)+1;
}, function(err, success, snap) {
// if the counter updates successfully, then write the record
if( err ) { throw err; }
else if( success ) {
var ref = fb.child('things').push({hello: 'world'}, function(err) {
if( err ) { throw err; }
console.log('created '+ref.name());
});
}
});
И каждый раз, когда запись удаляется, счетчик должен быть уменьшен.
var recordId = 'thing123';
var fb = new Firebase(URL);
fb.child('thing_counter').transaction(function(curr) {
if( curr === 0 ) { return undefined; } // cancel if no records exist
return (curr||0)-1;
}, function(err, success, snap) {
// if the counter updates successfully, then write the record
if( err ) { throw err; }
else if( success ) {
var ref = fb.child('things/'+recordId).remove(function(err) {
if( err ) { throw err; }
console.log('removed '+recordId);
});
}
});
Теперь о правилах безопасности:
{
"rules": {
"max": { ".write": false },
"thing_counter": {
".write": "newData.exists()", // no deletes
".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= root.child('max').val()"
},
"things": {
".write": "root.child('thing_counter').val() < root.child('max').val()"
}
}
}
Обратите внимание, что это не заставляет пользователя писать в thing_counter перед обновлением записи, поэтому, хотя это подходит для ограничения количества записей, оно не подходит для обеспечения правил игры или предотвращения читов.
Другие ресурсы и Мысли
Если вы хотите защитить уровень игры, проверьте эту скрипту , в которой подробно описано, как создавать записи с инкрементными идентификаторами, включая правила безопасности, необходимые для обеспечения соответствия счетчику. Вы можете комбинировать это с приведенными выше правилами, чтобы обеспечить максимальное значение для инкрементных идентификаторов и обеспечить, чтобы счетчик обновлялся до записи записи.
Кроме того, убедитесь, что вы не слишком задумываетесь об этом, и есть законный прецедент для ограничения количества записей, а не просто для удовлетворения здоровой дозы беспокойства. Это сложная задача, чтобы просто обеспечить квоту бедного человека в ваших структурах данных.
Хотя я думаю, что до сих пор не существует доступного правила для выполнения такой вещи, здесь доступна выборочная облачная функция, которая делает это:
https://github.com/firebase/functions -samples / дерево / мастер / лимитных детей
$id >= 'rec'+root.child('incid/counter').val()
, где$id
равен значениюcounter
, найденному в вашей скрипке. Если пользователь удаляет запись$id
say3
, мы можем остаться с1,2,4,5
, в этот момент эти правила будут падать справа? Как я могу с этим справиться? – Dan Kanze 26 March 2014 в 15:46$id
не было целым числом, которое соответствует текущему значениюcounter
. Что делать, если.write
находится в объектном свойстве, разделяющем muiltiple records, или если каждый$id
был случайным? У вас есть идеи, которые не требуют$id
для увеличения с помощьюcounter
? – Dan Kanze 26 March 2014 в 20:15$id
хочет оторваться от этого шаблона, я думаю, что это то, что мне нужно сделать. – Dan Kanze 26 March 2014 в 21:58