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 %>
我目前正在学习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 %>