#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. Это хорошо. Я могу использовать это, чтобы иметь единую часть для всех моих полей типа «выпадающий выбор». Отлично!