对于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
一样进行检查。
建议什么?有没有更好的方法?希望有......
也非常感谢有关此事的任何建议
答案 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