DRY表单部分用于创建和更新

eju*_*ker 5 forms ruby-on-rails dry

我有一个_form.html.erb表单部分有助于干掉我的代码,但我需要表单有不同的标签,具体取决于我是创建新用户还是更新现有用户.

这是我的表格部分.我不需要在更新期间显示eula复选框,我还需要将"创建我的帐户"提交按钮文本替换为更新时更合适的内容.

<% form_for @user do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name, 'Full name' %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :username %><br />
    <%= f.text_field :username %>
  </p>
  <p>
    <%= f.label :email, 'Email address' %><br />
    <%= f.text_field :email %>
  </p>
  <p>
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </p>
  <p>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </p>
  <p>
    <%= f.check_box :eula %>
    <%= f.label :eula, 'I agree to the terms and conditions' %>
  </p>
  <p><%= f.submit "Create my account" %></p>
<% end %>
Run Code Online (Sandbox Code Playgroud)

以下哪一项是最好的方法?

  • 有2个单独的表单部分,一个用于创建,一个用于更新
  • 有一个形式部分,但有基于行动的条件标签(这可能吗?)
  • 将公共部分分解为部分并在创建和更新表单中重用它

如果我要做有条件的表格,我该如何检查正在执行的操作?

hgm*_*mnz 12

ActiveRecord具有new_record?可用于决定在表单上显示内容的方法:

<% form_for @user do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name, 'Full name' %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :username %><br />
    <%= f.text_field :username %>
  </p>
  <p>
    <%= f.label :email, 'Email address' %><br />
    <%= f.text_field :email %>
  </p>
  <p>
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </p>
  <p>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </p>
  <% if @user.new_record? %>
    <p>
      <%= f.check_box :eula %>
      <%= f.label :eula, 'I agree to the terms and conditions' %>
    </p>
  <% end %>
  <p><%= f.submit @user.new_record? ? "Create my account" : "Update my account" %></p>
<% end %>
Run Code Online (Sandbox Code Playgroud)


Eli*_*ter 3

将 <form> 标记包裹在调用部分标记周围,并将提交按钮放在相应的视图中。仅将 eula 复选框放入创建视图中。

您可以在新视图和更新视图中创建变量并将其用作标签名称。

<%= f.label email, emaillabel %>
Run Code Online (Sandbox Code Playgroud)

[编辑]如果您需要将变量传递给部分,请使用以下命令:

<%= render :partial => 'form', :locals => { :myvar => myvar } %>
Run Code Online (Sandbox Code Playgroud)