如何使用私有方法保持 DRY?
How to stay DRY using private methods?
我正在使用 Rails 5.0。
创建新的控制器并在其中添加越来越多的代码我发现我在每个 class 的私有部分中有很多相同的方法,例如
private
def find_post
@post = Posts.find(params[:id])
end
def find_user
@user = User.find(params[:id])
end
def find_group
...
end
等等。
有什么方法可以为所有需要它的 class 包含一组 "standard" 私有方法吗?
您可以像在模型中一样在控制器中使用 concerns。
只需在 app/controllers/concerns/finders.rb
中定义一个名为 Finders
或其他名称的关注点,然后 include Finders
即可使用它。
另请注意,由于 Ruby 2.0 def
实际上是 returns 带有方法名称的符号,因此可以执行以下操作:
private def find_post
@post = Posts.find(params[:id])
end
private def find_user
@user = User.find(params[:id])
end
虽然这确实会导致输入稍微多一些,但它比 class 级别访问修饰符更明确且更不容易出错。
你能不能只从父控制器继承,而是使用受保护的方法?
class PostParentController < ApplicationController
before_filter :find_user # might be a different method name in Rails 5
before_filter :find_post
protected
def find_post
@post = Posts.find(params[:id])
end
def find_user
@user = User.find(params[:id])
end
end
子类:
class PostChildController < PostParentController
def show
end
def create
end
# etc
end
我正在使用 Rails 5.0。 创建新的控制器并在其中添加越来越多的代码我发现我在每个 class 的私有部分中有很多相同的方法,例如
private
def find_post
@post = Posts.find(params[:id])
end
def find_user
@user = User.find(params[:id])
end
def find_group
...
end
等等。
有什么方法可以为所有需要它的 class 包含一组 "standard" 私有方法吗?
您可以像在模型中一样在控制器中使用 concerns。
只需在 app/controllers/concerns/finders.rb
中定义一个名为 Finders
或其他名称的关注点,然后 include Finders
即可使用它。
另请注意,由于 Ruby 2.0 def
实际上是 returns 带有方法名称的符号,因此可以执行以下操作:
private def find_post
@post = Posts.find(params[:id])
end
private def find_user
@user = User.find(params[:id])
end
虽然这确实会导致输入稍微多一些,但它比 class 级别访问修饰符更明确且更不容易出错。
你能不能只从父控制器继承,而是使用受保护的方法?
class PostParentController < ApplicationController
before_filter :find_user # might be a different method name in Rails 5
before_filter :find_post
protected
def find_post
@post = Posts.find(params[:id])
end
def find_user
@user = User.find(params[:id])
end
end
子类:
class PostChildController < PostParentController
def show
end
def create
end
# etc
end