2017-02-10 61 views
0

コントローラ複数の値を持つThymeleaf switch文を使用できますか?

@ControllerAdvice 
public class UserRoleAdvice { 

    private static final Logger log = LoggerFactory.getLogger(UserRoleAdvice.class); 

    @Autowired 
    UsersRepository usersRepository; 

    @ModelAttribute("currentRole") 
    public String currentRole(Principal principal, Model model) { 
     Users user = usersRepository.findOneByInitialName(principal.getName()); 
     if (user != null) { 
      log.info(user.getRole().toString()); 
      model.addAttribute("currentRole", user.getRole().toString()); 
      return user.getRole().toString(); 
     } else { 
      return "ANONYMOUS"; 
     } 
    } 
} 

私は、データベース内の値に基づいて、自分のページに表示される内容を制御するためにThymeleafのswitch文を使用しています。

<th:block th:unless="${currentROLE} eq 'EMPLOYEE'"> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

私は${currentROLE}が文字列EMPLOYEE、またはMANAGERを示した場合は、ログインページを非表示にしたいが、${currentROLE}の値がない場合は、それを示しています。

このような(擬似コード)を行う方法はありますか?

<th:block th:unless="${currentROLE} eq 'EMPLOYEE' & || eq 'MANAGER'"> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

あるいは

<th:block th:unless="${currentROLE} exists> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

答えて

2

はいth:unlessは正しい方法です。しかし、あなたの小切手は間違っていると思います。試してみてください:

"${currentROLE.name == 'EMPLOYEE'}" 

および/または

"${currentROLE.name} == 'EMPLOYEE or MANAGER'" 

または

"${currentROLE.name} == 'EMPLOYEE' or ${currentROLE.name} == 'MANAGER'" 
+0

奇妙な。もう一つは私に狂ったエラーを与えます: '' HTTP Status 500 - 要求処理に失敗しました。 org.thymeleaf.exceptions.TemplateInputException:テンプレート解析中にエラーが発生しました(テンプレート: "class path resource [templates/home.html]") '' – santafebound

+0

@santafebound updated answer。今すぐ働かなければならない。 – Patrick

+1

ありがとうございます。私は中間のものを使ったが、彼らはすべて働いた。 – santafebound

1

http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#switch-statements

あなたとならば/しない限りのことをしたくないかもしれない三つの可能性との何か。それはスイッチでもありません。スイッチは基本的にスイッチ(ケース、ケース、ケース...)です。これはif文で明白ですが、いくつかのオプションスイッチを超えて読みやすく、拡張が容易です。

この場合は、デフォルトの場合を示し、「*」以上のような

<div th:switch="${currentROLE.name}"> 
    <span th:case="EMPLOYEE">stuff</span> 
    <span th:case="MANAGER">other stuff</span> 
    <span th:case="*">default stuff</span> 
</div> 

を見てしまいます。どちらのケースも真でない場合、それはそこに行く。

唯一可能な値がEMPLOYEE、MANAGERまたは何もない場合、 "false"、 "off"、または "no"でない文字列が比較されない場合はtrueに評価されます。だからth = $ {currentROLE.name}は、値がなければ== {currentROLE.name}が起こる間、文字列が存在し、nullでない場合に発生します。これは基本的に、JavaScriptが行う真実性や虚偽性のように機能しています。

今後のプログラム開発方法と、ここで何をしようとしているのかを考えてください。

+0

一重引用符を使用しない理由はありますか? '' ''のように? – santafebound

+1

私がThymeleafを学び、私が使っている大会では、これらの値のブロックを二重引用符で囲み、物の中に一重引用符を使用する方法です。私は一貫して "MANAGER"と "MANAGER"が事実上同じ文字列である限り、あなたがすることは重要ではないと思います。しかし、「MANAGER」と「MANAGER」は異なることを意味します。 – Daveycakes