【问题标题】:Best practice for DRYing up New and Edit forms using partial使用部分干燥新和编辑表单的最佳实践
【发布时间】:2013-06-30 01:38:49
【问题描述】:

这应该很容易,我是菜鸟。

我有一个模型的新视图和编辑视图,这些视图使用部分显示表单。对于编辑表单,我想显示一个我不想在新表单中显示的字段。

我是否应该将一个说明其处于编辑模式的局部变量传递给局部变量并使用局部变量中的条件来显示该字段?

在这种情况下,让部分知道什么动作调用它的最佳做法是什么?

【问题讨论】:

  • 做了更多研究,会使用“new_record”吗?在部分是最好的方法?

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

这将只显示new 表单的字段

<%# app/views/something/_form.html.erb %>

<% form_for something do |form| %>

  <%# common fields ... %>

  <% if something.new_record? %>
    <%= form.text_field :foo %>
  <% end %>

<% end %>

如果您希望它出现在 edit 表单上,只需将 if 切换为 unless

【讨论】:

    【解决方案2】:

    如果您使用的是form_for,您可以为newedit 使用相同的模板。

    form_for 将检查对象是否被持久化。如果是新记录,则action url指向#update,如果是持久化,则指向#create

    所以,是的,当“新建”和“编辑”使用相同的模板时,您的评论将起作用。当obj.new_record? 时,它是一个编辑表单。

    【讨论】:

    • 谢谢!这就是我最终要做的。
    • 看起来你已经把两者颠倒了。如果 obj.new_record?为真,那么它是new 形式,将指向#create。如果 obj.persisted?为真,那么它是edit 形式,将指向#update
    【解决方案3】:

    如果可能,尽量避免在您的视图中使用条件语句(并非总是可能)

    _form.html.erb

    # common fields only
    # ...
    

    _new.html.erb

    <%= form_for @your_model do |f| %>
      <fieldset>
          <% # render _form partial %>
      </fieldset>
    
      <div>
        <%= f.submit "Create New XXXX" %>
      </div>
    <% end %>    
    

    _edit.html.erb

    <%= form_for @your_model do |f| %>
      <fieldset>
          <% # render _form partial %>
    
          <% # render fields that only appear for edit %>
      </fieldset>
    
      <div>
        <%= f.submit "Save Changes" %>
        <%= link_to 'Cancel', xxxx_path %>        
      </div>
    <% end %>  
    

    【讨论】:

    • 好的,如果您希望字段显示为附加或开头,这只是一个选项?在我的情况下,它们需要位于部分表单中间的某个位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多