Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:小型控件,实现模型内部的所有逻辑_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails:小型控件,实现模型内部的所有逻辑

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','

我在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','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的方式)。