Ruby on Rails, если еще вопрос - PullRequest
8 голосов
/ 21 января 2010

У меня есть приложение, в котором в макете у меня есть div user_name, который будет отображать разные вещи в зависимости от того, вошли они в систему или нет, администратор и т. Д. Сейчас мой код следующий:

  <% if current_user.role == "admin" %>
  <p id="admintxt">You are an admin!</p>
      <%= link_to "Edit Profile", edit_user_path(:current) %>
   <%= link_to "Logout", logout_path %>
  <% elsif current_user %>
   <%= link_to "Edit Profile", edit_user_path(:current) %>
   <%= link_to "Logout", logout_path %>
  <% else %>
<%= link_to "Register", new_user_path %>
<%= link_to "Login", login_path %>
<% end %>

У меня уже есть помощник current_user, и все работало нормально, когда код был просто:

<% if current_user %>
  <%= link_to "Edit Profile", edit_user_path(:current) %>
  <%= link_to "Logout", logout_path %>
<% else %>
    <%= link_to "Register", new_user_path %>
    <%= link_to "Login", login_path %>
<% end %>

Теперь, когда я делаю это заявление elsif, когда я захожу как администратор, это работает, и я получаю текст, отображаемый с правильными ссылками. Когда я не являюсь пользователем-администратором / вышел из системы, я получаю неопределенный метод `role 'для ошибки nil: NilClass ... Кроме того, мои данные current_user объявлены в контроллере приложения следующим образом:

helper_method :current_user


private

def current_user_session
  return @current_user_session if defined?(@current_user_session)
  @current_user_session = UserSession.find
end

def current_user
  return @current_user if defined?(@current_user)
  @current_user = current_user_session && current_user_session.record
end

Любые идеи, что я могу сделать, чтобы отобразить результат, который я хочу? «Если они - пользователь с атрибутом роли, равным admin, они получают некоторый текст и ссылки для входа в систему, если они просто пользователь, они получают ссылки для входа в систему, и если они не входят в систему, они получают ссылки для регистрации и входа в систему. .

Спасибо!

Ответы [ 3 ]

12 голосов
/ 21 января 2010
<% if current_user %>
  <% if current_user.role == "admin" %>
    <p id="admintxt">You are an admin!</p>
    <%= link_to "Edit Profile", edit_user_path(:current) %>
    <%= link_to "Logout", logout_path %>
  <% else %>
    <%= link_to "Edit Profile", edit_user_path(:current) %>
    <%= link_to "Logout", logout_path %>
  <% end %>
<% else %>
  <%= link_to "Register", new_user_path %>
  <%= link_to "Login", login_path %>
<% end %>

или с рельсами> = 2.3

<% if current_user.try(:role) == "admin" %>
  <p id="admintxt">You are an admin!</p>
  <%= link_to "Edit Profile", edit_user_path(:current) %>
  <%= link_to "Logout", logout_path %>
<% elsif current_user %>
  <%= link_to "Edit Profile", edit_user_path(:current) %>
  <%= link_to "Logout", logout_path %>
<% else %>
  <%= link_to "Register", new_user_path %>
  <%= link_to "Login", login_path %>
<% end %>
5 голосов
/ 21 января 2010

Скрыть проверку роли в текущем цикле пользователя, что имеет побочный эффект упрощения вашего условия.

<% if current_user %>
  <%= content_tag(:p, "You are an admin!", :id=>"admintxt") if current_user.role == "admin" %>
  <%= link_to "Edit Profile", edit_user_path(:current) %>
  <%= link_to "Logout", logout_path %>
<% else %>
  <%= link_to "Register", new_user_path %>
  <%= link_to "Login", login_path %>
<% end %>
3 голосов
/ 21 января 2010
<% if current_user and current_user.role == "admin" %>

Это должно предотвратить ошибку, когда пользователь не вошел в систему, но вы можете реструктурировать весь блок, чтобы удалить избыточные тесты против current_user равным nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...