【问题标题】:DRY form partial for create and update用于创建和更新的 DRY 表单部分
【发布时间】:2009-09-22 15:27:30
【问题描述】:

我有一个 _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 种形式的部分,但有基于操作的条件标签(这可能吗?)
  • 将公共部分分解为部分,并在创建和更新表单中重用它

如果我要执行条件形式,我将如何检查正在执行的操作?

【问题讨论】:

    标签: ruby-on-rails forms dry


    【解决方案1】:

    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 %>
    

    【讨论】:

    • &lt;%= f.submit, ... %&gt;后面可能少了一个逗号
    【解决方案2】:

    标签包裹在 call 部分标签周围,并将提交按钮放在相应的视图中。仅将 eula 复选框放在创建视图中。

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

    <%= f.label email, emaillabel %>
    

    [编辑] 如果您需要将变量传递给部分使用:

    <%= render :partial => 'form', :locals => { :myvar => myvar } %>
    

    【讨论】:

    • 真的有用吗?如果表单标签在部分之外,它仍然可以访问“f”对象吗?
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多