重构Rails视图

时间:2011-06-07 01:11:32

标签: ruby-on-rails refactoring

我是Rails开发的新手,所以请耐心等待。我正在创建一个视图,其上有几个看起来非常相似的字段。它只是乞求以某种方式进行重构,但我无法弄明白。请参阅下面的代码示例:

<%= form_for(@tapelog) do |f| %>
  <div class="container">
    <div class="field span-16">
      <div class="span-8 labelRight">
        <%= f.label :client %>
      </div>
      <div class="span-8 last">
        <%= f.collection_select :client_id, Client.find(:all), :id, :name,
                                { :prompt => "Select a Client..." },
                                { :class => "automatixSelect" } %>
      </div>
    </div>
    <div class="field span-16">
      <div class="span-8 labelRight">
        <%= f.label :employer %>
      </div>
      <div class="span-8 last">
        <%= f.collection_select :employer_id, Employer.find(:all), :id, :name,
                                { :prompt => "Select an Employer..." },
                                { :class  => "automatixSelect" } %>
      </div>
    </div>
  ....
<% end %>

大约有7个这样的领域。我试图将它们全部放入部分中,这样我就可以减少这个页面上的混乱,但错误因为'f'没有定义。关于如何在这里减少一些混乱的任何想法?关于Ruby重构的任何其他一般提示也是受欢迎的。

谢谢, - A.

2 个答案:

答案 0 :(得分:3)

如果要在后续部分中使用'f',请将其作为参数传递

<%= render :partial => :some_partial, :locals => { :f => f } %>

答案 1 :(得分:1)

我要做的第一件事是将“f”局部变量重命名为“form”以便清楚。然后,将代码提取为部分是合理的:

<div class="field span-16">
  <div class="span-8 labelRight">
    <%= form.label :employer %>
  </div>
  <div class="span-8 last">
    <%= form.collection_select :employer_id, Employer.find(:all), :id, :name,
                               { :prompt => "Select an Employer..." },
                               { :class  => "automatixSelect" } %>
  </div>
</div>

在我看来,这是一个belongs_to关系,所以我可能会创建一个名为“belongs_to”的部分并将其呈现为:

<%= render :belongs_to, :parent => :employer, :form => form %>

我们的想法是,我们将有一个本地命名的“父”,我们可以改变局部。请注意,我使用了简写部分语法。它与:

相同
<%= render :partial => :belongs_to, :locals => { :parent => :employer, :form => form } %>

<div class="field span-16">
  <div class="span-8 labelRight">
    <%= form.label parent %>
  </div>
  <div class="span-8 last">
    <%= form.collection_select :"#{parent}_id", parent.to_s.capitalize.constantize.find(:all), :id, :name,
                               { :prompt => "Select an #{parent.to_s.capitalize}..." },
                               { :class  => "automatixSelect" } %>
  </div>
</div>