多控制器中方法的Rails约定

时间:2012-02-06 22:25:20

标签: ruby-on-rails coding-style

我有一个应用,其用户的个人资料可以通过site.com/username访问。在选择用户名时,我对我的UsersController中的方法进行AJAX调用,以确保用户名可用(并在提交时检查后端)。我现在想要添加也可以通过site.com/groupname访问的组。由于组和用户名不能冲突,因此响应AJAX调用的任何控制器方法都需要同时检查两者,因此check_username_available和check_groupname_available方法将执行完全相同的操作。最好的做法/ Rails方法是什么,因为我不想在UsersController和GroupsController中复制代码?

为每个控制器设置一个方法似乎有点多余,即使将功能拉出到帮助器,因为仍然会有两条路径执行相同的操作。有一个单独的控制器也解决了这个问题,但不确定这是否是很好的Rails实践。

2 个答案:

答案 0 :(得分:4)

重用的代码可以通过模块共享

class UsersController < ActionController::Base
  include NameUniqueness
end

class GroupsController < ActionController::Base
  include NameUniqueness
end

module NameUniqueness
  protected
  def check_name
    # implementation here
  end
end

两个控制器现在都可以访问check_name实例方法。

答案 1 :(得分:0)

DanPickett的答案很棒。

另一种选择是在用户模型中创建一个类方法,并从每个控制器中调用它。由于这个名称检查似乎是模型的工作,这就是我要做的。

class User
    def self.check(stuff) ...