Рефакторинг представления Rails

#ruby-on-rails #refactoring

#ruby-on-rails #рефакторинг

Вопрос:

Я новичок в разработке 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. Я попытался поместить их все в partials, просто чтобы уменьшить беспорядок на этой странице, но это приводит к ошибке, потому что ‘f’ не определено. Есть идеи о том, как я мог бы уменьшить часть беспорядка здесь? Любые другие советы в целом по рефакторингу Ruby также приветствовались бы.

Спасибо, — A.

Комментарии:

1. похоже ли это на полный рефакторинг? во-первых, вы можете удалить все эти divs. правильная структура формы обычно принимает форму набора полей и неупорядоченного (или упорядоченного) списка элементов формы. взгляните сюда: github.com/justinfrench/formtastic

2. Хотелось бы изучить это еще немного. Прямо сейчас это немного не укладывается у меня в голове, но я добавил это в закладки, когда у меня будет более 6 дней опыта кодирования Rails 🙂

3. без проблем, лучше всего, если вы поищете плагины, которые могли бы вам помочь. это экономит вам МАССУ кодирования и работы :). также я вижу, что вы используете grid framework (960 или blueprint?) вы также можете использовать драгоценный камень compass( compass-style.org ) таким образом, вам не нужно добавлять эти классы в свою разметку. все это есть в css, где и должно быть! 🙂

Ответ №1:

Если вы хотите использовать ‘f’ в последующих частях, передайте его в качестве параметра

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

Ответ №2:

Первое, что я бы сделал, это переименовал локальную переменную «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 %>
  

Идея в том, что у нас будет локальное имя «parent», которое мы можем изменить в partial. Обратите внимание, что я использовал сокращенный частичный синтаксис. Это то же самое, что:

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

Комментарии:

1. Это хорошо. Я могу использовать это, чтобы иметь единую часть для всех моих полей типа «выпадающий выбор». Отлично!