辅助方法或模型或控制器?

Cam*_*ron 2 model-view-controller ruby-on-rails

假设我有一个带有选择菜单的form_for,用于在belongs_to关联上分配用户:

...
form.select :user_id, @users, :prompt => "Select a User"
...
Run Code Online (Sandbox Code Playgroud)

目前我在控制器中有@users如下:

@users = User.all.map { |u| [u.full_name, u.id] }
Run Code Online (Sandbox Code Playgroud)

我觉得这个逻辑可能会转移到帮助者甚至模型中.但我很困惑在哪里处理这个以及如何处理.

EmF*_*mFi 5

一般答案取决于您使用它的频率:

  • 帮助程序:经常使用但仅在视图或控制器中使用
  • model:经常用于可以使用模型的任何地方(其他型号)
  • 控制器:很少使用,仅用于特定操作.

但是在你的情况下,答案不是上述情况,而是停止尝试重新发明轮子.人们尝试使用Rails的事情中,大约95%是其他人已经完成的任务.它很可能是在Rails Core中,或者以gem或plugin形式存在.

您正在尝试做的事情已经完成,并且内置于Rails核心.它是一个名为collection_select的ActionView :: Helpers :: FormOpitionsHelper方法

collection_select完全符合您的要求,它比单一用途方法更强大.

它的形式是

collection_select(object, method, collection, value_method,
  text_method, select_options = {}, html_options)
Run Code Online (Sandbox Code Playgroud)

将value_method和text_method发送到集合中的每个项目,以获取每个选择选项的选择值和显示文本.不要求列名都是必需的.

像这样使用它:

<% form_for @whatever do |form| %>
  <%= form.collection_select :user_id, User.all, :id,
    :full_name, :prompt => "Select a User" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)