【问题标题】:How to keep Rails application DRY如何保持 Rails 应用程序 DRY
【发布时间】:2014-01-10 17:38:36
【问题描述】:

我有这样的代码应该可用于每个控制器和所有视图。

    @categs1=  Category.where({:id => [2,7,15,16] })
    @categs2=  Category.where(:id => [18,21,24,31,32] )
    @categs3=  Category.where(:id => [34,35,36,40,42] )

但是为了让所有控制器都可以使用它,我必须在它们上面进行复制。我试图放入应用程序控制器,它应该是所有控制器的默认设置,但它没有工作。

我阅读了有关使用助手的建议。它是如何工作的 ?像视图中的部分?我需要制作一个包含此代码的代码,然后在需要的地方编写 require 代码??

谢谢:)

【问题讨论】:

  • 将其作为(私有或受保护的)方法,ApplicationController 应该可以工作。

标签: ruby-on-rails dry


【解决方案1】:

application_controller 中创建一个名为load_category 的过滤器,并在单个查询中加载所有类别。

class ApplicationController < ActionController::Base

  before_filter :load_category

  private 

  def load_category
    all_categories = Category.where({:id => [2,7,15,16,18,21,24,31,32,34,35,36,40,42] })
    @categs1 = all_categories[0..3]
    @categs2 = all_categories[4..8]
    @categs3 = all_categories[9..13]
  end

end

【讨论】:

  • @Bachan Smruty:... 应该是 [0...4]
  • 啊……是的,我还以为是..我的错……:)
【解决方案2】:

这个概念本身是错误的。那是 Wordpress 的方式。

此类 ID 是数据,而不是业务逻辑。您的应用应与数据分开。

正确的做法是,假设你有'foo'、'bar'、'barz'这样三个重要的类别要在app中特别处理,然后在表中设置这样的东西说添加一个type字段。

使用 rake 任务或自己执行将这些 id 分配给 'foo'、'bar'、'barz'。

然后在控制器中

foo = Category.where(type: 'foo')

【讨论】:

    【解决方案3】:

    您应该小心加载仅带有 ID 的集合... 无论哪种方式,将该代码放在应用程序控制器中似乎是最好的解决方案。 在你的应用控制器中试试这个:

    before_filter :set_categories
    
    private
    def set_categories
      @categs1=  Category.where({:id => [2,7,15,16] })
      @categs2=  Category.where(:id => [18,21,24,31,32] )
      @categs3=  Category.where(:id => [34,35,36,40,42] )
    end
    

    【讨论】:

      【解决方案4】:

      我的建议:

      1. Category 中设置一个名为“type”的新字段。
      2. 我会这样使用:

      @cars = Category.where(type: 'cars')

      @bicycles = Category.where(type: 'bicycles')

      @unicorns = Category.where(type: 'unicorns')

      所以不管有多少ID,只需要按类型过滤并从视图调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2011-06-06
        • 2013-02-15
        • 2019-10-20
        相关资源
        最近更新 更多