【问题标题】:How to stay DRY using private methods?如何使用私有方法保持 DRY?
【发布时间】:2017-02-02 06:21:10
【问题描述】:

我在 Rails 5.0 上。 创建新的控制器并在那里添加越来越多的代码我发现我在每个类的私有部分中有很多相同的方法,例如

private

def find_post
  @post = Posts.find(params[:id])
end

def find_user
  @user = User.find(params[:id])
end

def find_group
  ...
end

等等。

有没有办法为所有需要它的类包含一组“标准”私有方法?

【问题讨论】:

  • 如果您认为您将所有这些方法与操作一起使用,您可以将代码移动到一种方法中
  • 好的,在某些情况下它是有道理的,但它仍然在许多类中重复。
  • @AlexanderGorg 如果你想干控制器代码,并且这个方法在其他控制器中也有用,你可以创建帮助器,你可以在你的控制器中包含那个帮助器。
  • @ashvin 甚至私有方法?
  • @AlexanderGorg 为此你必须创建concerns

标签: ruby-on-rails ruby controller dry private-methods


【解决方案1】:

您可以像在模型中一样在控制器中使用concerns

只需在app/controllers/concerns/finders.rb 中定义一个名为Finders 的关注点,然后在include Finders 中使用它。

还请注意,由于 Ruby 2.0 def 实际上返回一个带有方法名称的符号,因此可以执行以下操作:

private def find_post
  @post = Posts.find(params[:id])
end

private def find_user
  @user = User.find(params[:id])
end

虽然这确实会导致更多的输入,但它比类级别的访问修饰符更明确且更不容易出错。

【讨论】:

    【解决方案2】:

    您不能只从父控制器继承,而是使用受保护的方法吗?

    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 
    

    Ruby public, private, protected methods

    【讨论】:

    • 在某些情况下 - 这是一个决定,但我有非常不同的功能(图像、视频、帖子等)的空白,但是寻找用户、投票、答案等的方法是相当的相同的。我知道我需要某种模块,但现在我确定我需要关注!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多