0

このビルド ケースの Ruby 条件を記述する簡単な方法を考え出すのに苦労しています。私は3つのデバイスユーザーモデルを持っており、どのユーザーがログインしているかに基づいて、ナグバーに正しいユーザークラスを表示したいだけです。アイデアは、デバイス user_signed_in? を使用する if else ステートメントの基本的に 3 つのブロックを持つことです。以下に示すヘルパー:

<nav class="top-bar">
<section class="top-bar-section">
    <ul class="left">
    <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Admin Login Page", admin_path %></li>
        <li><%= link_to "Company Login Page", company_path %></li>
    </ul>
    <ul class="right">
        <% if user_signed_in? %>
            <li><%= link_to "Edit Profile", edit_user_registration_path %></li>
            <li><%= link_to "Logout", destroy_user_session_path, method: :delete %></li>
        <% else %>
            <li><%= link_to "Login", new_user_session_path %></li>


        <% if admin_signed_in? %>
            <li><%= link_to "Edit Profile", edit_admin_registration_path %></li>
            <li><%= link_to "Logout", destroy_admin_session_path, method: :delete %></li>
        <% else %>
            <li><%= link_to "Login", new_admin_session_path %></li>


        <% if company_user_signed_in? %>
            <li><%= link_to "Edit Profile", edit_company_user_registration_path %></li>
            <li><%= link_to "Logout", destroy_company_user_session_path, method: :delete %></li>
        <% else %>
            <li><%= link_to "Login", new_company_user_session_path %></li>
        <% end %>   
    </ul>

問題は、実際にはこのように機能しないことです。そのため、問題は 2 つあります。まず、この条件付き構文を単純化する方法は? 第二に、それを機能させる方法は?

4

2 に答える 2

1

おそらくelsif、3 つの個別のブロックではなく、ここが必要です。次の効果を試してみてください。

if user_signed_in?
  ...
elsif admin_signed_in?
  ...
elsif company_user_signed_in?
  ...
elsif params[:action] == 'index'
  ...
elsif params[:action] == 'admin'
  ...
else
  ...
end

または代わりに:

if user_signed_in?
  ...
elsif admin_signed_in?
  ...
elsif company_user_signed_in?
  ...
elsif params[:action] == 'index'
  ...
elsif params[:action] == 'admin'
  ...
elsif params[:action] == 'company_user'
  ...
else
  # handle any other case where none of above conditions are met, e.g. params[:action] == 'foobar'
end
于 2013-09-24T06:15:45.590 に答える
0

問題の解決策を見つけることができました。他の人が同じ問題を解決しようとしている場合に後で役立つことを期待して、解決策を投稿します。これは Rails 4 用です。

最初に、applications_controller.rb ファイルに以下を入れる必要があります。

 def after_sign_in_path_for(resource)
 case resource
 when User then '/'
 when Admin then '/admin'
 when CompanyUser then '/company'
 end
end

次に、元の質問ビュー コードをこれにリファクタリングします。

    <ul class="right">          
            <% if user_signed_in? %>
                <li><%= link_to "Edit Profile", edit_user_registration_path %></li>
                <li><%= link_to "Logout", destroy_user_session_path, method: :delete %></li>
            <% elsif admin_signed_in? %>
                <li><%= link_to "Edit Profile", edit_admin_registration_path %></li>
                <li><%= link_to "Logout", destroy_admin_session_path, method: :delete %></li>       
            <% elsif company_user_signed_in? %>
                <li><%= link_to "Edit Profile", edit_company_user_registration_path %></li>
                <li><%= link_to "Logout", destroy_company_user_session_path, method: :delete %></li>
            <% else %>
                <% if params[:action] == 'index' %>
                    <li><%= link_to "User Login", new_user_session_path %></li>
                <% elsif params[:action] == 'admin' %>  
                    <li><%= link_to "Admin Login", new_admin_session_path %></li>
                <% else params[:action] == 'company_user' %>
                    <li><%= link_to "Company Login", new_company_user_session_path %></li>
                <% end %>   
            <% end %>   
    </ul>

お役に立てれば。

于 2013-09-28T14:45:13.587 に答える