Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 渲染模型驱动选择的辅助对象/局部对象的最佳实践_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 渲染模型驱动选择的辅助对象/局部对象的最佳实践

Ruby on rails 渲染模型驱动选择的辅助对象/局部对象的最佳实践,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,假设我有一个模型产品,我想要一个包含所有产品的下拉选择框。此下拉列表在多个视图中使用,因此将由助手方法创建。从产品中获取选择选项的“最佳实践”位置在哪里?我是在需要显示下拉列表的每个控制器操作中设置@products=Product.all,还是通过调用Product.all使helper方法自包含?如果我处理的是部分,或者如果我过滤的是产品,即产品,答案会改变吗_category@category? MVC说使用控制器,而DRY说使用助手。在我看来,控制器应该决定用户看到的数据。用户如何看待

假设我有一个模型产品,我想要一个包含所有产品的下拉选择框。此下拉列表在多个视图中使用,因此将由助手方法创建。从产品中获取选择选项的“最佳实践”位置在哪里?我是在需要显示下拉列表的每个控制器操作中设置@products=Product.all,还是通过调用Product.all使helper方法自包含?如果我处理的是部分,或者如果我过滤的是产品,即产品,答案会改变吗_category@category? MVC说使用控制器,而DRY说使用助手。

在我看来,控制器应该决定用户看到的数据。用户如何看待它可以由视图或助手决定

所以我建议你把

@products = Product.all

在控制器中


您应用的任何类型的过滤器都应该在控制器中完成

查看内置的集合\u选择表单帮助器。您可以传入不同的集合Product.all,Product。根据需要,在不同的视图中

从链接:

集合\选择对象、方法、集合、值\方法, text_方法,options={},html_options={}

返回和标记现有数据集的集合 返回对象类的方法的值。从中返回的值 将选择实例对象上的调用方法。如果呼叫 方法返回nil,如果不包括:prompt或 :在选项哈希中包含_blank

:value\u方法和:text\u方法参数是要调用的方法 在集合的每个成员上。返回值用作值 属性和每个标记的内容。他们可以 也可以是响应调用的任何对象,例如proc,它将 为集合的每个成员调用以检索值/文本

与此方法一起使用的对象结构示例:

类Post 类作者 示例用法选择Post实例的关联作者, @职位:

集合\u选择:post,:author\u id,author.all,:id, :name_,带_首字母,提示:true

如果@post.author\u id已为1,则返回:

请 选择D.Heinemier 汉森·D·托马斯·M·克拉克


由于rails是一个模型-视图-控制器MVC框架,您将希望该逻辑位于模型上。有一些方法可以为您的选择返回选项,这可能是最好的,但请对此持保留态度,因为这些东西会随着应用程序的变化而发生很大的变化。我可能会尝试以下几点:

class Product < ActiveRecord::Base
  def self.get_select_options(category=nil)
    if category.nil?
      Product.all
    else
      Product.in_category(category)
    end
  end
end

。。。然后您可以使用Product.get\u select\u选项或Product.get\u select调用它_options@category

我同意这种方法应该存在于模型中,我有几种类似的方法。问题是,对这个方法的调用去了哪里?下意识的回答是,它应该放在控制器中,但是如果在多个视图中有相同的选择框,这不是很干,如果在同一视图中有多个这样的选择框,那么很快就会得到一个胖控制器。在这种情况下,我可能会使用视图辅助方法,调用Product.get\u select\u options。根据您从文档中提取的内容,调用将直接进入视图,但我不确定这是否足以清楚地回答问题。我觉得医生有时候经常?为了清晰起见,忽略最佳实践。好吧,创建一个选择列表是一个视图助手,如果您在任何给定视图中需要的只是这个,请直接使用它。如果要选择什么产品,请传入模型中的不同范围。如果您对select有更具体的需求,可以将其包装在另一个帮助器中,但我不清楚为什么它应该在控制器中。另外,对我来说,一个“最佳实践”是,如果存在的话,不要自己滚。但也许我错过了什么。不过,我随时准备开悟。我总是很高兴知道一个更好的方法。另外,看看我发布的链接。关于这个主题,还有其他几个有趣的替代方案,它们可能会再次帮助您编写自己的代码。-这种方法对于构建select非常有用,但我的问题是,将获取select选项的调用放在何处。在集合中,选择:post、:author\u id、author.all、:id、:name\u和\u首字母,提示:true对author.all的调用具有直接与模型对话的视图。在MVC之后,@authors=Author.all应该在控制器中,并且视图应该使用@authors。但是,如果选择在多个视图、多个控制器上进行,则可以将对模型的调用直接放在使用集合\选择或其亲属的帮助器中。哪种方式最好?正如我在上面的评论中所说的,没有什么 创建助手方法时出错,例如使用集合的all_products_select与Product.all以及使用products.purchased等的purchased_products_select。
class Product < ActiveRecord::Base
  def self.get_select_options(category=nil)
    if category.nil?
      Product.all
    else
      Product.in_category(category)
    end
  end
end