使用CanCanCan与视图隐藏/显示内容 - 建议

时间:2015-12-15 09:02:10

标签: ruby ruby-on-rails-4 cancancan

对于CanCanCan的一些好事,这可能是一个明显的问题,但我发现很难绕过它。

我有一个应用程序,它有很多角色(campus_rep,campus_manager,operations_manager,admin等)。他们都可以访问“管理员”部分,但会根据他们的角色看到不同的菜单选项。

例如:

  • 管理员可以管理所有“客户”
  • 运营经理可以管理他们所属学校的客户

ability.rb

的摘录
if user.role == 'admin'
  can     :manage,  JobApplication
elsif user.role == 'operations_manager'
  can     :manage,  JobApplication,       school_id: user.schools.map(&:id)
elsif ser.role == 'campus_rep'
  # blah but nothing to do with JobApplication
end

我一直在考虑使用if can? :manage, Customer,但即使是'operations_managers'也没有通过它是有意义的。

建议摆脱类似情况的方法是什么?

我试过if can? :manage, Customer.new(school: current_user.schools.first)哪种方法有效,但看起来不太好。

我做了一些事情,比如将can :see, JobApplication添加到'admin'和'operations_managers',然后像if can? :see, JobApplication一样进行检查。

建议什么?有没有更好的方法?希望有......

也非常感谢有关此事的任何建议

1 个答案:

答案 0 :(得分:1)

您的代码提到了JobApplications,但您的问题主要是关于客户:我会谈论客户,但任何模型的原则都是相同的。

如果我理解正确,您的目标是将一组客户传递给您。但您只希望视图向客户显示您的用户(比如运营经理)可以管理。

在这种情况下,您的控制器或视图模板代码可以根据能力过滤客户。所以你会做类似

的事情
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.stats.Counter;
import edu.stanford.nlp.stats.ClassicCounter;
import edu.stanford.nlp.util.CoreMap;

import java.util.Properties;

public class AdjectiveSentimentExample {

    public static void main(String[] args) throws Exception {

        Counter<String> adjectivePositiveCounts = new ClassicCounter<String>();
        Counter<String> adjectiveNegativeCounts = new ClassicCounter<String>();

        Annotation review = new Annotation("The movie was great!  It was a great film.");
        String sentiment = "positive";

        Properties props = new Properties();
        props.setProperty("annotators", "tokenize, ssplit, pos, lemma");
        StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
        pipeline.annotate(review);
        for (CoreMap sentence : review.get(CoreAnnotations.SentencesAnnotation.class)) {
            for (CoreLabel cl : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
                if (cl.get(CoreAnnotations.PartOfSpeechAnnotation.class).equals("JJ")) {
                    if (sentiment.equals("positive")) {
                        adjectivePositiveCounts.incrementCount(cl.word());
                    } else if (sentiment.equals("negative")) {
                        adjectiveNegativeCounts.incrementCount(cl.word());
                    }
                }

            }
        }

        System.out.println("---");
        System.out.println("positive adjective counts");
        System.out.println(adjectivePositiveCounts);
    }
}

如果有很多客户,这将会非常慢,因此一些程序员会尝试绕过cancancan并设计数据库查询。例如,您可以在数据库中查询属于特定学校的所有客户。

您的主要误解是您正在尝试根据课程测试能力。但是,您的规则基于单个对象。这是正常的,所以通常的方法是测试每个实例。

参考:http://www.rubydoc.info/gems/cancancan/1.13.1#2__Check_Abilities___Authorization