我的表单部分看起来像这样:
<%= form_for(@pool) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :tournament %><br />
<%= f.collection_select :tournament_id, Tournament.active, :id, :name, :prompt => true %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这看起来像代码味道,因为视图不应该知道如何获取<select>
标记的数据。让控制器分配实例变量的替代方法是有问题的,因为我必须在几个操作中复制该代码,具体取决于是否呈现此表单。
在ASP.NET MVC中,我只是将该字段拉出到局部视图中,并通过调用RenderAction
来显示它,这将评估一个常见的控制器操作。但是,在Rails中render :action => '/view'
似乎只允许渲染完整的视图。我对Rails很陌生,所以我不确定最佳实践是什么。
答案 0 :(得分:2)
您可以像coder_tim建议的那样执行辅助方法,但在我看来,仍然会在视图中保留数据访问权。
控制器是适当的位置,如果您担心重复,请设置一个仅对需要此集合的操作执行的before_filter:
before_filter :get_active_tournaments, :only => [:new, :edit]
例如。
希望这有帮助。
答案 1 :(得分:0)
我喜欢那段代码的味道:)简单化极端主义。更少的文件=更少的担心方法=更清洁的代码。
但是,有时候在您的应用程序中使用下拉列表的次数太多,并且它比调用作用域稍微复杂一些。在那种情况下,我写了一个帮手。