Частичная форма 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 %>

Что из следующего является лучшим способом сделать это?

  • иметь 2 отдельных части формы, одну для создания и одну для обновления
  • иметь 1 частичную форму, но иметь условные метки, основанные на действии (возможно ли это?)
  • разделите общую часть на частичную и повторно используйте ее в формах создания и обновления.

Если бы я должен был сделать условную форму, как бы я проверил, какое действие выполняется?


person ejunker    schedule 22.09.2009    source источник


Ответы (2)


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 %>
person hgmnz    schedule 22.09.2009
comment
Вероятно, не хватает запятой после <%= f.submit, ... %> - person Kleber S.; 09.06.2012

Оберните тег формы вокруг частичного тега вызова и поместите кнопку отправки в соответствующие представления. Установите флажок eula только в режиме создания.

Вы можете создать переменную в представлениях new и update и использовать ее в качестве имени метки.

<%= f.label email, emaillabel %>

[Изменить] Если вам нужно передать переменные частичному, используйте это:

<%= render :partial => 'form', :locals => { :myvar => myvar } %>
person Elizabeth Buckwalter    schedule 22.09.2009
comment
Это действительно работает? Если тег формы находится за пределами партиала, будет ли он по-прежнему иметь доступ к объекту f? - person Karl; 23.09.2009