Rails:小型控制器,实现模型内的所有逻辑

时间:2012-06-30 14:23:38

标签: ruby-on-rails ruby

我在控制器中写了这段代码:

def list
  @codes = Code.order("created_at")
  @languages = Language.order('name').collect {|l| [l.name, l.coderay]}

@codes是一系列帖子。每个代码都有languagecpp字符串的text字段。它包含代码令牌 @languages是格式为['C++', 'cpp'], ['Plain Text', 'text']的编程语言数组 换句话说,Language的格式为:name, :coderay。我只是为了制作选择框而使用它。 所以我使用:coderay作为主键,但ruby将自己的PK :id添加到此模型中。这些模型没有联系。

IDE给我写了这个警告:

  

控制器操作应该调用除初始之外的一个模型方法   找到或新的   如果是控制器,此检查会发出警告   action初始化后包含多个模型方法调用   .find或.new。建议您实现所有业务逻辑   在模型类中,并使用单个方法来访问它

解决这个问题的最佳解决方案是什么? 1)在CodesLanguage之间添加1到m的链接,并使:coderay PK。 2)忽略此警告
3)移动Language.order('name').collect {|l| [l.name, l.coderay]}进行查看。

我认为最好的解决方案是(1),我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果你只需要一个选择

,那么

3就是最好的

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })
来自rails文档的

示例

并且不要为您的业务逻辑创建您不需要的关联。

答案 1 :(得分:1)

您可以通过使用属于,并设置外键,实现选项1在LanguageCode之间添加1对1链接。

code.rb

belongs_to :language, foreign_key: 'coderay', primary_key: 'language'

language.rb

has_many :codes, foreign_key: 'coderay', primary_key: 'language'

但是,如果要为选择框加载静态数据,我通常更喜欢从控制器中的before_filter执行此操作,并将其传递给视图。

你可能也喜欢decent_exposure宝石。 - https://github.com/voxdolo/decent_exposure