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

この時点で、ユーザー インスタンスまたは Null オブジェクト (avdi の投稿http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/に示されているようなもの) を返すことができます。 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

次に、ビューにあるように使用できます。

于 2015-03-10T14:52:11.200 に答える