假设我有一个型号产品,我想要一个包含所有产品的下拉选择框。此下拉列表在多个视图中使用,因此它将由辅助方法创建。从“产品”中获取选择选项的“最佳实践”位置在哪里?我是否需要在每个需要显示下拉列表的控制器操作中设置@products = Product.all
,还是通过调用Product.all
来使辅助方法自包含?如果我正在处理部分问题,或者我正在过滤产品(即Product.in_category(@category)
),答案是否会改变? MVC说使用控制器,但DRY说使用帮助器。
答案 0 :(得分:1)
查看内置的collection_select表单助手。您可以在不同视图中根据需要传递不同的集合(Product.all,Product。)。
从链接:
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_options
或Product.get_select_options(@category)