2012-01-02 35 views
2

我想从用这种方法“技能”控制器显示的状态:访问的方法在部分从其它控制器

def also_expert? 
    Patent.where(:user_id => current_user, :skill_id => @skill.id, :state => 1).first 
end 

所以在视图我可以使用:

<% if also_expert? %> 
    Expert 
<% end %> 

当我使用它的部分来自其他控制器我有一个“未定义的方法”这个我明白

<%= render :partial => 'shared/skill', :collection => topic.skills, :locals => { :topic => topic.community } %> 

如何使用它在一个局部?

回答

1

确定对特定逻辑负责的人或什么是具有挑战性的。 Refactoring RubyRails AntiPatterns对我排序这些类型的问题帮助很大。如果您考虑控制器和每个模型的责任,那么控制器应该知道用户是否是技能专家并没有什么意义。如果你能说服自己这个逻辑属于模型,那么它就属于它的模型。

有人可能会争辩说,用户有责任了解这一点,而另一个人可能会认为这是技能的责任。无论哪种方式,将它移动到这些模型之一将使您的代码更容易维护和理解。

不知道你的代码太多,它真的归结为哪个“感觉不错”。我可能会说,这是技能模型的责任,并有移动的逻辑:

class Skill 
    def user_is_expert?(user) 
    patents.where(:user_id => user.id, :state => 1).first 
    end 
end 

从您的视图:

@skill.user_is_expert?(current_user) 
0

的帮手,而不是一个控制器定义这个方法:

module ExpertHelper 

    def also_expert? 
     Patent.where(:user_id => current_user, :skill_id => @skill.id, :state => 1).first 
    end  

end 

而你,也就能够使用它的意见。

+0

我强烈建议对这种一对夫妇的原因。 1)这个逻辑不属于视图。辅助者是在地毯下扫描复杂的视图逻辑时的一种荣耀的方式,大多数时候属于模型2)辅助方法本质上成为全局方法。当你定义两个具有相同名称的人时,越是越难追踪。 3)单元测试模型方法比辅助方法更容易。 – 2012-01-02 14:03:10

+0

此外,让方法依赖于@技能实例变量就像使用全局变量一样。如果一个方法需要一个变量,它应该被传入或者是该类的一部分状态。那最终会让你陷入屁股。 – 2012-01-02 14:06:26