如何保持Rails应用程序干燥

时间:2014-01-10 09:16:45

标签: ruby-on-rails dry

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

    @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] )

但为了让它可供所有控制器使用,我必须复制它们。我试图放入应用程序控制器,它应该像所有控制器的默认值,但它确实没有用。

我读到了关于使用助手的建议。它是如何工作的 ?喜欢视图中的偏见?我需要创建一个包含此代码的代码,然后在需要的地方编写需要的代码??

谢谢:)

4 个答案:

答案 0 :(得分:3)

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

load_category

答案 1 :(得分:3)

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

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

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

使用rake任务或自己动手将这些id分配给'foo','bar','barz'。

然后在控制器中

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

答案 2 :(得分:2)

你应该注意只用他们的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

答案 3 :(得分:1)

我的建议:

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

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

         

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

         

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

    因此无论ID有多少,只需要按类型过滤并从视图中调用。