0

I want to make some helpers for my rolify methods.

So, I've created the following:

Users helper

module UsersHelper

    #Check if current user is admin

    def admin_check
      if current_user
      if current_user.has_role? :admin
     end
    end

    #Check if current user is pro and admin

    def admin_and_pro_check
      if current_user
      if current_user.has_any_role? :admin, :pro
     end
    end

    #Check if current user is pro

    def pro_check
      if current_user
      if (current_user.has_role? :pro) && (current_user.is_pro == true)
     end
    end
  end

end

Now, in my view, how do I use them? Which is the better way?

<%= pro_check do %>
  <%= f.input :url, label: "Visto en", placeholder: "www.paginaweb.com" %>
<% end %>

<%= if pro_check %>
  <%= f.input :url, label: "Visto en", placeholder: "www.paginaweb.com" %>
<% end %>
4

2 回答 2

1

我会将这些添加到用户模型中。不利的一面是,如果您继续添加角色,这可能会变得非常难以维护。它将使它更好地工作,并使真相检查更具可读性。

我还将在您的 current_user 方法中使用 Null 对象模式,这样您就可以避免所有的 nil 检查。我讨厌重复的 nil 检查,但如果你对它们没意见,那就完全忽略这个建议。

正如您将在下面看到的,您的代码中的if检查大部分是不必要的。

class User < ActiveRecord::Base
  #...
  def pro?
    self.has_role?(:pro) && self.is_pro == true
  end

  def admin?
    self.has_role? :admin
  end
end

此时,您可以您的current_user 方法,或者如果您使用的是设计,您可以将您的专业支票嵌入支票user_signed_in?

这是设计示例

<% if user_signed_in? %>
  <% if current_user.pro? %>
    User is a pro
  <% elsif current_user.admin? %>
    User is an admin
  <% elsif current_user.admin? && current_user.pro? %>
    Current user is an admin and a pro
  <% else %>
    Current user is neither an admin nor a pro
  <% end %>
<% end %>

如果您不使用设计,您当然可以创建自己的user_logged_in?方法来检查当前用户是否存在。我认为这是一个很好的可读方法名称。你可以把它放进去application_helper.rb

于 2015-03-10T14:51:45.220 回答
1

你的方法不返回任何东西。您想要一个返回 true 或 false 的方法,我建议:

def admin_check
  current_user && current_user.has_role?(:admin)
end

def admin_and_pro_check
  current_user && current_user.has_any_role?(:admin, :pro)
end

def pro_check
  current_user && current_user.has_role?(:pro) && current_user.is_pro == true
end

然后您可以像在您的视图中一样使用 then 。

于 2015-03-10T14:52:11.200 回答