Ruby on rails Rails:小型控件,实现模型内部的所有逻辑
我在controller中编写了以下代码:Ruby on rails Rails:小型控件,实现模型内部的所有逻辑,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在controller中编写了以下代码: def list @codes = Code.order("created_at") @languages = Language.order('name').collect {|l| [l.name, l.coderay]} @codes是一个帖子数组。对于cpp或text字符串,每个代码都有language字段。它包含coderay令牌。 @languages是一组编程语言,其格式为['C++','cpp'],['Plain Text','
def list
@codes = Code.order("created_at")
@languages = Language.order('name').collect {|l| [l.name, l.coderay]}
@codes
是一个帖子数组。对于cpp
或text
字符串,每个代码都有language
字段。它包含coderay令牌。@languages
是一组编程语言,其格式为['C++','cpp'],['Plain Text','Text']
换句话说,
语言
的格式是:name,:coderay
。我只在视图中使用它来创建选择框。
所以我使用:coderay作为主键,但ruby在这个模型中添加了自己的PK:id
。而且这些模型没有关联
IDE向我发出以下警告:
控制器操作应该调用一个模型方法而不是初始方法
查找或新建此检查警告控制器 操作包含多个模型方法调用,在初始 .查找或查找。新建。建议您实现所有业务逻辑 并使用单个方法访问它 解决此问题的最佳解决方案是什么?
1) 在
代码
和语言
之间添加1-to-m链接,并制作:coderay
PK.2) 忽略此警告
3) 移动
Language.order('name')。收集{l.name,l.coderay]}
以查看
我认为最好的解决方案是(1),我怎样才能做到这一点呢?3在这种情况下是最好的,如果你只需要一次选择
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })
rails文档中的示例
不要创建业务逻辑不需要的关联。3在这种情况下是最好的,如果您只需要一次选择
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })
rails文档中的示例
不要创建业务逻辑不需要的关联。您可以实现选项1,通过使用所属的并设置外键,在您的
语言
和代码
之间添加一对一的链接
code.rb
belongs_to :language, foreign_key: 'coderay', primary_key: 'language'
语言.rb
has_many :codes, foreign_key: 'coderay', primary_key: 'language'
但是,如果要为选择框加载静态数据,我通常更喜欢从控制器中的before_过滤器加载静态数据,并将其传递给视图
您可能还喜欢
delegate\u曝光
gem。- 您可以实施选项1,通过使用“所属”并设置外键,在您的语言
和代码
之间添加一对一链接
code.rb
belongs_to :language, foreign_key: 'coderay', primary_key: 'language'
语言.rb
has_many :codes, foreign_key: 'coderay', primary_key: 'language'
但是,如果要为选择框加载静态数据,我通常更喜欢从控制器中的before_过滤器加载静态数据,并将其传递给视图
您可能还喜欢
delegate\u曝光
gem。- 不同意。这打破了MVC关注点的完全分离。控制器应与模型交互以执行查询,并应将结果传递给视图。视图不应该直接与模型交互。在独角兽和小精灵的理想世界中,这是正确的,但在现实世界中不是。我认为这个解决方案不是一个好主意。它让视图完成控制器的工作,对我们没有任何好处。MVC只是一个工具。这种方法是rails的第一种方法。此外,它将更快,您将需要更少的测试规格。这打破了MVC关注点的完全分离。控制器应与模型交互以执行查询,并应将结果传递给视图。视图不应该直接与模型交互。在独角兽和小精灵的理想世界中,这是正确的,但在现实世界中不是。我认为这个解决方案不是一个好主意。它让视图完成控制器的工作,对我们没有任何好处。MVC只是一个工具。这种方法是rails的第一种方法。而且它会更快,而且你需要的测试规格也会更少,这是我以前使用过的过滤器。@Yuri,让我们面对现实吧,传递实例变量的整个想法太糟糕了。根据定义,这违反了封装。从模式和实践的角度来看,体面的曝光可能是最“正确”的方式,从每个资源的角度来看,一个控制器。体面的曝光非常好,但我只对非常简单的控制器使用它。无论如何,如果我需要在页面上进行一次选择,我更喜欢用rails的方式)。谢谢,我使用了before_filter。@Yuri,让我们面对它,传递实例变量的整个想法太糟糕了。根据定义,这违反了封装。从模式和实践的角度来看,体面的曝光可能是最“正确”的方式,从每个资源的角度来看,一个控制器。体面的曝光非常好,但我只对非常简单的控制器使用它。无论如何,如果我需要在页面上选择一个选项,我更喜欢用rails的方式)。