2015-06-16 5 views
2

Приложение, в котором я работаю, имеет разные пользовательские роли клиента, менеджера проектов и суперпользователя, а на целевой странице они могут искать статьи и есть расширенный фильтр для фильтрации записей после поиска. Нравится: Фильтровать по автору.Как ограничить пользователя поиском конкретной модели?

Я хочу скрыть предварительный фильтр для клиента, для этого я хочу определить способность, используя cancancan.

В настоящее время я делаю это с использованием методов модели. Эти методы возвращают true и false по типу пользователя.

client? 
project_manager? 
super_user? 

Текущий код:

<% unless current_user.client? %> 
    <%=link_to "Advance Search", "#" %> 
<%end%> 

Я хочу, чтобы удалить это и использовать cancancan вместо этого.

<%if can? :filter, Article %> 
    <%=link_to "Advance Search", "#" %> 
<%end%> 

Для этого я попытался

cannot :filter, Article if user.client? 

Но это ограничение всех пользователей фильтрации.

+0

@pradeepDhingra. не может: фильтр, статья, если user.client? эта строка должна ограничивать только клиент, можете ли вы рассказать нам, как это ограничивает всех пользователей? – Packer

+0

@Prabhakar его не показывает ссылку предварительного поиска для всех пользователей. Это мой вопрос, он не должен ограничивать всех пользователей. Раньше он показывал ссылку для других пользователей, кроме клиента, но после применения cancan ограничил всех пользователей. –

ответ

1

Вам необходимо объявить правило can, чтобы фактически разрешить пользователям :filter.

can :filter, Article do |article| 
    !user.client? 
end 

Или

unless user.client? 
    can :filter, Article 
end 

Пример использования cannot:

can :friend, User 

cannot :friend, User do |other_user| 
    other_user.blocks?(user) 
end 
+0

'if user.client? can: filter, Article end' Это работает, но почему бы не использовать 'cannot'. –

+0

Потому что 'cannot' фактически не позволяет любому пользователю ничего делать. Он просто объявляет то, что пользователь не может сделать. – max

+0

Я думаю, что вы немного смущены тем, как условные работы «не могут: фильтровать», если пользователь user.client? Выполняет 'can not: filter, Article', только если предикат, если выполняется' if user.client? '. Он не выполняет обратное действие создания разрешения 'can'. Его так же, как 'puts 'hello', если user.client? ' – max

-1

Вы можете попробовать это

# in models/user.rb 
def is?(role) 
    roles.include?(role.to_s) 
end 

# in models/articles.rb 
can :filter, :all if user.is? :client || :super_user 

выше фильтр будет делать только клиент или SUPER_USER может фильтровать вещи.

+0

Вы даже прочитали вопрос? ОП не указал, что он использует любые роли или библиотеку ролей. – max

0

Изменения роли немного следующий

can :filter, Article unless user.client? 

Вы можете прочитать о пользовательском определении роли для канкана из