我想通过这种方法显示“技能”控制器的状态:
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 } %>
我如何在部分中使用它?
答案 0 :(得分:1)
确定对特定逻辑负责的人或者什么可能具有挑战性。 Refactoring Ruby和Rails 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)
答案 1 :(得分:0)
在助手而不是控制器中定义此方法:
module ExpertHelper
def also_expert?
Patent.where(:user_id => current_user, :skill_id => @skill.id, :state => 1).first
end
end
您将能够在视图中使用它。