在我的Rails应用程序创建新文章时,我需要一个Users
和Categories
的列表,以便为某些下拉列表选择一个类别和作者。从Helper获取数据或在Rails中使用模型
目前我做这个控制器:
def new
@article = Article.new
@categories = Category.order('title asc').collect { |t| [t.title, t.id] }
@users = User.order('email asc').collect { |t| [t.email, t.id] }
end
然后在视图:
<%= f.select :category_id, options_for_select(@categories), :prompt => '-- Please Select --', :required => true %>
但根据RubyDocs这是不好的做法,这不是很干,因为我那么有编辑方法也是这样做的。为了防止这种情况,我有两个可能的选择,我能想到的:
1)使用这样的帮手:
def users_for_select
User.order('email asc').collect { |t| [t.email, t.id] }
end
def categories_for_select
Category.order('title asc').collect { |t| [t.title, t.id] }
end
然后在视图:
<%= f.select :category_id, options_for_select(categories_for_select), :prompt => '-- Please Select --', :required => true %>
2)它移动到一个型号:
def self.categories_for_select
Category.order('title asc').collect { |t| [t.title, t.id] }
end
def self.users_for_select
User.order('email asc').collect { |t| [t.email, t.id] }
end
然后在控制器做到这一点:
def new
@article = Article.new
@categories = Category.categories_for_select
@users = User.users_for_select
end
选项1感觉更清洁,因为它从控制器中删除了代码,但我的印象是选项2会更好,因为它使用数据模型(按预期)并且控制器仍在发送数据(如预期的那样)但更干。
我觉得自己是助手和模型获取数据之间有时也会出现一些重叠。
..而又一个选择 - 作为两者之间的一种 - 是装饰者模式 - https://github.com/drapergem/draper。这个逻辑太过于关注于你的模型。话虽如此,过去我只是使用你描述的帮助者方法。 –
选项1比选项2好得多,不仅DRY,而且Model类也应该尊重SRP。 –