Rails替代在视图中包含活动记录调用

时间:2011-03-22 17:33:57

标签: ruby-on-rails ruby-on-rails-3 view

我的表单部分看起来像这样:

<%= 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很陌生,所以我不确定最佳实践是什么。

2 个答案:

答案 0 :(得分:2)

您可以像coder_tim建议的那样执行辅助方法,但在我看来,仍然会在视图中保留数据访问权。

控制器是适当的位置,如果您担心重复,请设置一个仅对需要此集合的操作执行的before_filter:

before_filter :get_active_tournaments, :only => [:new, :edit]

例如。

希望这有帮助。

答案 1 :(得分:0)

我喜欢那段代码的味道:)简单化极端主义。更少的文件=更少的担心方法=更清洁的代码。

但是,有时候在您的应用程序中使用下拉列表的次数太多,并且它比调用作用域稍微复杂一些。在那种情况下,我写了一个帮手。