0

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

4

3 回答 3

1

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

集合选择

从链接:

集合选择(对象,方法,集合,值方法,文本方法,选项 = {},html_options = {})

对象类方法的现有返回值集合的返回值和标记。从实例对象上调用方法返回的值将被选中。如果调用方法返回 nil,则在选项哈希中不包含 :prompt 或 :include_blank 时不会进行选择。

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

用于此方法的示例对象结构:

类 Post < ActiveRecord::Base belongs_to :author end

类作者 < ActiveRecord::Base has_many :posts def name_with_initial "#{first_name.first}.#{last_name}" end end

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

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

如果@post.author_id 已经是 1,这将返回:

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

于 2013-10-21T20:05:10.137 回答
0

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

所以我建议你把

@products = Product.all

或者

Product.in_category(@category)

在你的控制器中

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

于 2013-10-21T20:00:27.847 回答
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_options或调用Product.get_select_options(@category)

于 2013-10-21T20:05:20.953 回答