帮助/部分的最佳实践,呈现模型驱动的选择

时间:2013-10-21 19:47:16

标签: ruby-on-rails ruby-on-rails-4

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

3 个答案:

答案 0 :(得分:1)

查看内置的collection_select表单助手。您可以在不同视图中根据需要传递不同的集合(Product.all,Product。)。

collection_select

从链接:

  

collection_select(对象,方法,集合,value_method,   text_method,options = {},html_options = {})

     

现有集合的返回和标记   返回对象类的方法的值。从中返回的值   将选择对实例对象的调用方法。如果打电话   方法返回nil,不进行选择而不包括:prompt或   :include_blank在选项哈希中。

     

:value_method和:text_method参数是要调用的方法   在每个集合成员。返回值用作值   每个标签的属性和内容。他们能   也可以是响应调用的任何对象,例如proc   要求集合的每个成员检索值/文本。

     

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

     

class Post< ActiveRecord :: Base belongs_to:author end

     

class Author< ActiveRecord :: Base has_many:posts def   name_with_initial       “#{first_name.first}。#{last_name}”end end

     

示例用法(为Post实例选择关联的Author,   @post):

     

collection_select(:post,:author_id,Author.all,:id,   :name_with_initial,prompt:true)

     

如果@ post.author_id已经为1,则会返回:

     

请   选择D. Heinemeier   Hansson D. Thomas M. Clark

答案 1 :(得分:0)

在我看来,Controller应该决定用户看到的数据。用户如何看待它可以由视图或帮助者决定。

所以我建议你把

@products = Product.all

Product.in_category(@category)
控制器中的

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

答案 2 :(得分:0)

如果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_select_optionsProduct.get_select_options(@category)

进行调用