2011-03-22 48 views
3

活动记录呼叫我有偏的形式,看起来像这样:Rails的替代方案,包括针对

<%= 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

我不太明白你在问什么。我不知道它是否有帮助,但可以在部分渲染中调用'render:partial =>'file''。 – edmz 2011-03-22 17:49:28

+0

也许辅助方法会很有用。 – 2011-03-22 17:54:37

回答

2

你可以按照coder_tim的建议做一个辅助方法,但在我看来,仍然会在视图中留下数据访问。

控制器是这个正确的地方,如果你担心重复,建立一个的before_filter只作用于需要这个集合的操作:

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

例如。

希望这会有所帮助。

+0

真棒,我曾想过一个辅助方法,但是通过一个其他方法调用的辅助方法看起来像是过度工程,只是为了创建一个抽象。这正是我期望的那种面向导轨的解决方案。 – Vadim 2011-03-22 18:27:44

+0

:),不客气。 – 2011-03-22 18:28:45

0

我喜欢那个代码的气味:)对极端主义的简单。较少的文件=较少的方法担心=较干净的代码。

但是,有时候在应用程序中使用了多次下拉式选项,这比调用作用域稍微复杂一些。在那种情况下,我写了一个帮手。

+0

我认为这绝对是我的一部分,因为它很简单,可能也很好。作为开发人员,我们往往过度工作,因为我们已经被教导说抽象是好的做法。 – Vadim 2011-03-22 18:45:03