从其他控制器访问部分方法

时间:2012-01-02 13:40:59

标签: ruby-on-rails ruby-on-rails-3

我想通过这种方法显示“技能”控制器的状态:

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 } %>

我如何在部分中使用它?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

在助手而不是控制器中定义此方法:

module ExpertHelper

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

end

您将能够在视图中使用它。