Frage

How to achieve simple scoping in your views such as:

<% if @user.admin %>

where "admin" is the following scope in user.rb:

scope :admin, where(role: "admin")

there is a column Role which is a string in the Users table

I've done the same thing before with another Model (but not a devise user model) to which I could later call

<% if objective.completed %>

right after calling an each method in the objectives.

However When I do the exact same thing to a user model I get an

undefined method `admin' for #<User:0x00000107e39038>

How could I make it work? I've been digging for hours.

For a no scope workaround try:

<% if @user.role == "admin" %>
War es hilfreich?

Lösung

You simply can't use scopes this way. Scopes are used as class methods, so if you run

User.admin

it returns list of users matching given condition. What you need is an instance method. Add it to your user.rb file:

def admin?
  admin == 'admin'
end

and you will be able to use it in your view:

- if @user.admin?

anyways, you should definitely reconsider storing roles as string in users table. Try to create another table called roles.

Andere Tipps

Scopes are usually class level methods, having said that, how can you access it with an instance. I think, that is why the error says undefined method.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top