Ruby on Rails等问题

时间:2010-01-21 16:56:19

标签: ruby-on-rails ruby

我有一个应用程序,在布局中我有一个user_name div,根据他们是否登录显示不同的东西,是管理员等。现在我的代码如下:

  <% 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语句时,当我以管理员身份登录时,它可以工作,并且我会使用正确的链接显示文本。当我不是管理员用户/注销时,我得到nil的未定义方法`role':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 个答案:

答案 0 :(得分:12)

<% 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 %>

或使用Rails&gt; = 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 %>

答案 1 :(得分:5)

在当前用户循环中隐藏角色检查,这会产生简化条件的副作用。

<% 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 %>

答案 2 :(得分:3)

<% if current_user and current_user.role == "admin" %>

这可以防止在没有用户登录时出现错误,但是您可以重新构建整个块,以便删除针对current_user为空的冗余测试。