Я решил аналогичную проблему, создав пользовательскую страницу и применив канк-способность на этой странице. В противном случае эта возможность была применена к ресурсу.
ActiveAdmin.register_page "Summary" do
menu parent: "UserProcess", label: "Summary"
content title: "Summary" do
.......
.......
end
end
и примените к нему способность следующим образом:
class Ability
include CanCan::Ability
def initialize(users)
can :manage UserProcess
cannot :manage, ActiveAdmin::Page, name: "Summary"
end
end
Если вы нашли к тому времени другое чистое решение, пожалуйста, отредактируйте меня!
Это тестируется в андроиде 7.0 до андроида 10.0, и он работает
, Используют этот код, чтобы проверить, содержит ли строка специальный символ и числа:
name = firstname.getText().toString(); //name is the variable that holds the string value
Pattern special= Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
Pattern number = Pattern.compile("[0-9]", Pattern.CASE_INSENSITIVE);
Matcher matcher = special.matcher(name);
Matcher matcherNumber = number.matcher(name);
boolean constainsSymbols = matcher.find();
boolean containsNumber = matcherNumber.find();
if(constainsSymbols == true){
//string contains special symbol/character
}
else if(containsNumber == true){
//string contains numbers
}
else{
//string doesn't contain special characters or numbers
}
Взгляните на класс java.lang.Character
. В нем есть несколько методов тестирования, и вы можете найти тот, который соответствует вашим потребностям.
Примеры: Character.isSpaceChar (c)
или ! Character.isJavaLetter (c)
Что именно вы называете «специальным символом»? Если вы имеете в виду что-то вроде «все, что не является буквенно-цифровым», вы можете использовать класс org.apache.commons.lang.StringUtils (методы IsAlpha / IsNumeric / IsWhitespace / IsAsciiPrintable).
Если это не так тривиально, вы можете использовать регулярное выражение, которое определяет точный список символов, который вы принимаете, и сопоставляет строку с ним.
Все зависит от того, что именно вы подразумеваете под «специальным». В регулярном выражении вы можете указать
Я подозреваю, что вы имеете в виду последнее. Но если нет, используйте список [], чтобы точно указать, что вы хотите.
Сначала вам необходимо полностью определить специальные символы, которые вы хотите проверить.
Затем вы можете написать регулярное выражение и использовать
public boolean matches(String regex)
Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("I am a string");
boolean b = m.find();
if (b)
System.out.println("There is a special character in my string");
Посещайте каждый символ в строке, чтобы увидеть, находится ли этот символ в черном списке специальных символов; это O (n * m).
Псевдокод:
for each char in string:
if char in blacklist:
...
Сложность можно немного улучшить, отсортировав черный список, чтобы вы могли рано выходить из каждой проверки. Однако функция поиска строки, вероятно, представляет собой собственный код, поэтому эта оптимизация - которая была бы в байт-коде Java - могла бы быть более медленной.