Html.erbのif、elsif、else文に問題があります。 erbのif/elseステートメントに関する多くの質問を見てきましたが、elsifは含まれていなかったので、助けを求めたいと思いました。
ここに私のhtml.erbがあります:
<% if logged_in? %>
<ul class = "nav navbar-nav pull-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Account <b class="caret"></b>
</a>
<ul class="dropdown-menu pull-right">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", edit_user_path(current_user) %></li>
<li class="divider"></li>
<li>
<%= link_to "Log out", logout_path, method: "delete" %>
</li>
</ul>
</li>
</ul>
<% elsif has_booth?(current_user.id) %>
<ul>
<li>TEST</li>
</ul>
<% else %>
<ul class="nav navbar-nav pull-right">
<li><%= link_to "Sign Up", signup_path %></li>
<li><%= link_to "Log in", login_path %></li>
</ul>
<% end %>
これが私のhas_boothsメソッドです:
module BoothsHelper
def has_booth?(user_id)
Booth.exists?(user_id: user_id)
end
end
ヘッダーナビゲーションに、ユーザーごとに3種類のコンテンツを用意します。ログインしたユーザー、ブースを作成したログインしたユーザー、ログアウトしたユーザー。これまでのところ、3つのうち2つしか作成できません。変えてみた
<% elsif has_booth?(current_user.id) %>
に
<% elsif logged_in? && has_booth?(current_user.id) %>
それもうまくいきませんでした。私は私の声明を正しく書いていますか?どんな考えでも感謝します。ありがとう。
問題は、最初の条件が真であるため、そこで停止することです。あなたの最初の状態:
<% if logged_in? %>
ブースがない場合でも、最初の条件が真であるため、elsifに到達することはありません。次のいずれかが必要です。
<% if logged_in? && has_booth?(current_user.id) %>
// code
<% elsif logged_in? && !has_booth?(current_user.id) %>
// code
<% else %>
// code
<% end %>
あるいは、それらを2つのif/elseに分離する方がよりクリーンなアプローチかもしれません。
<% if logged_in? %>
<% if has_booth?(current_user.id) %>
// code
<% else %>
// code
<% end %>
<% else %>
// code
<% end %>
よりクリーンなアプローチは、ステートメントをフラットにし、最初にログインしていない状態を処理して、ブースがあるかどうかと一緒にテストする必要がないようにすることです。
<% if !logged_in? %>
// not logged in code
<% elsif has_booth?(current_user.id) %>
// logged in and has booth code
<% else %>
// logged in and does not have booth code
<% end %>
unless logged_in?
を使用することもできますが、elseとelsifは意味的にはあまり意味がありません。