Rails: form_for 缩短代码

Rails: form_for shortening code

我目前正在学习rails并且我有以下代码:

<%= form_for(@account) do |f| %>

  <%= f.label :username %>
  <%= f.text_field :username, class: 'form-control' %>

  <%= f.label :email %>    
   <%= f.email_field :email, class: 'form-control'  %>


  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control'  %>

  <%= f.label :password_confirmation, "Confirm your password" %>
  <%= f.password_field :password_confirmation, class: 'form-control'  %>

  <%= f.label :website %>
  <%= f.text_field :website, class: 'form-control'  %>

  <%= f.submit "Sign up!", class: "btn btn-primary" %>

<% end %>

我想添加字形,所以其中一个字段 (:email) 的代码如下所示:

  <div class="input-group"> 
      <div class="input-group-addon"> 
        <span class="glyphicon glyphicon-user"></span> 
      </div> 

      <%= f.email_field :email, class: 'form-control'  %>
  </div>

麻烦的是,我想对所有字段都这样做。

但是我必须为所有字段复制并粘贴这些相同的语句,更改 glyphicon-* 和字段名称(以及密码字段的字段类型)。有没有更简单的 DRY 方法来做到这一点?

Alon Swain 方法也是正确的,但我建议使用单独的部分而不是 _input_field_password.html.erb

<div class="input-group"> 
  <div class="input-group-addon"> 
    <span class="glyphicon glyphicon-user"></span> 
  </div> 

  <%= f.email_field field_name, class: 'form-control'  %>
 </div>

现在改变你的form.erb

<%= form_for(@account) do |f| %>

  <%= f.label :username %>
  <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :user_name}%>

  <%= f.label :email %>    
  <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :email} %>


  <%= f.label :password %>
  <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :password}%>

  <%= f.label :password_confirmation, "Confirm your password" %>
  <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :password_confirmation}%>

  <%= f.label :website %>
  <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :website}%>

  <%= f.submit "Sign up!", class: "btn btn-primary" %>

<% end %>

您还可以使用循环进一步重构它

<%= form_for(@account) do |f| %>
  <% [:username, :email, :password, :password_confirmation, :website].each do |field_name|
    <%= f.label :field_name %>
    <%= render partial 'input_field_password.html.erb', locals: {f: f, field_name: :field_name}%>
  <%end%>
  <%= f.submit "Sign up!", class: "btn btn-primary" %>

<% end %>