ruby-on-rails - 如何使用 Rspec 重构 Rails 模型中的复杂方法?

标签 ruby-on-rails ruby ruby-on-rails-3 rspec refactoring

我有以下复杂的方法。我正在尝试寻找并实现可能的改进。现在我将最后一个 if 语句移动到 Access 类。

def add_access(access)
   if access.instance_of?(Access)
     up = UserAccess.find(:first, :conditions => ['user_id = ? AND access_id = ?', self.id, access.id])
     if !up && company
       users = company.users.map{|u| u.id unless u.blank?}.compact
       num_p = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?', users, access.id])
       if num_p < access.limit
         UserAccess.create(:user => self, :access => access)
       else
         return "You have exceeded the maximum number of alotted permissions"
       end
     end
   end
 end

我还想在重构之前添加规范。我添加了第一个。应该如何看起来像其他人?

  describe "#add_permission" do
    before do
      @permission = create(:permission)
      @user = create(:user)
    end

    it "allow create UserPermission" do
      expect {
        @user.add_permission(@permission)
      }.to change {
        UserPermission.count
      }.by(1)
    end
  end

最佳答案

这是我的做法。

使对 Access 的检查更像初始断言,并在发生这种情况时引发错误。

创建一种新方法来检查现有用户访问权限 - 这似乎可重用且更具可读性。

然后,公司限制对我来说更像是一种验证,将其作为自定义验证移至 UserAccess 类中。

class User

  has_many :accesses, :class_name=>'UserAccess'

  def add_access(access)
    raise "Can only add a Access: #{access.inspect}" unless access.instance_of?(Access)

    if has_access?(access)
      logger.debug("User #{self.inspect} already has the access #{access}")
      return false
    end

    accesses.create(:access => access)
  end

  def has_access?(access)
    accesses.find(:first, :conditions => {:access_id=> access.id})
  end

end

class UserAccess

  validate :below_company_limit

  def below_company_limit
    return true unless company
    company_user_ids = company.users.map{|u| u.id unless u.blank?}.compact
    access_count = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?', company_user_ids, access.id])
    access_count < access.limit
  end

end

关于ruby-on-rails - 如何使用 Rspec 重构 Rails 模型中的复杂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146445/

相关文章:

windows - Capistrano 部署问题

ruby-on-rails - cancan + rspec = 未初始化常量 Anonymou(无 s)?

ruby-on-rails - 我的 Rails 应用程序不会在生产模式下更新本地化字符串

c - 下载 Rails - C 无法编译

ruby-on-rails - 自定义 i18n 错误消息会引发 InvalidPluralizationData 错误?

ruby-on-rails - Rails Heroku 数据库人口

ruby-on-rails - will_paginate 在 Twitter Bootstrap 选项卡中加载下一页上的默认事件选项卡

ruby-on-rails - 如何禁用 Rails 中某些 Assets 的默认 Assets 时间戳?

ruby - 卸载 ruby​​ 类

html - 瓦蒂尔 : How do I find an element where the class of that element and the class of one of its parents identifies it?