【问题标题】:Combining Two Models in Rails for a Form将 Rails 中的两个模型组合成一个表单
【发布时间】:2010-06-01 02:56:36
【问题描述】:

我对 Rails 很陌生,我一直在构建一个 CMS 应用程序 后端。

一切顺利,但我想知道这是否可能?

基本上我有两个模型:

@page { id, name, number }

@extended_page { id, page_id, description, image }

这个想法是有一堆页面,但不是所有页面都有 扩展内容。如果有扩展的页面 内容然后我希望能够拥有一个允许编辑的表单 他们两个。

在控制器中:

@page = Page.find(params[:id])
@extended= Extended.find(:first, :conditions => ["page_id =
?",@page.id])
@combined = ... #merge the two somehow

所以在视图中:

<%- form_for @combined do |f| %>

<%= f.label :name %>
<%= f.text_field :name %>

...

<%= f.label :description %>
<%= f.text_field :description %>

<%- end >

这样在控制器中,只需要一个模型 更新(将同时更新)。

这可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord forms model


    【解决方案1】:

    首先,我认为您不需要第二个模型。您可以简单地为 Page 模型定义方法 extended?,如果扩展页面模型的所有(或任何)属性都存在,则返回 true

    您可能还想查看fields_for 表单辅助方法。这样的事情应该进入你的视野:

    <%- form_for @combined do |f| %>
    
    <%= f.label :name %>
    <%= f.text_field :name %>
    
    <%- f.fields_for(:extended_page) do |ef| %>
    
      <%= ef.label :image %>
      <%= ef.file :image %>
      <!-- other extended page form fields -->
    
    <%- end %>
    
    <!-- Other page form fields -->
    <%- end %>
    

    【讨论】:

      【解决方案2】:

      是的,是的。 “嵌套表单”和“fields_for”是您的答案。

      <% form_for @combined do |form| %>
        <% form.fields_for :page do |nested_form| %>
          <%= nested_form.label :name %>
          <%= nested_form.text_field :name %>
         <% end %>
        <% form.fields_for :extended_page do |nested_form| %>
          <%= nested_form.label :desciption %>
          <%= nested_form.text_field :description %>
         <% end %>
       <% end %>
      

      帖子参数看起来像

      { "combined" => 
           "page" => {"name" => "the name"},
           "extended_page" => {"description" => "the description"}
      }
      

      所以您应该能够通过类似的方式创建页面和扩展页面

      page = Page.new(params[:combined][:page])
      extended_page = ExtendedPage.new(params[:combined][:extended_page])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        相关资源
        最近更新 更多