繁体   English   中英

从子控制器创建父模型

[英]Create parent model from child controller

我正在开发一个可接收有关公司信息的Web应用程序。 可以为(股票) PreferredOfferingIncorporation 换句话说,当我为其中一个模型创建新条目时,就会形成一个新公司。

结果表明,即使PreferredOfferingIncorporationCompany ,即使我试图通过preferred_offerings_controllerincorporations_controller创建新的Company ,我的数据库也会更干净。 这是我的问题; 我试图弄清楚如何配置我的视图和控制器以从子控制器创建父模型。 我已经做过一些研究,并且看到了另外两个有关如何使用Rails 3实现此目的的S / O帖子 ,但是似乎添加了强大的参数似乎为这项工作增加了另一层复杂性。

所以我有这样的模型设置

class Company < ActiveRecord::Base
    belongs_to :user
    has_one :incorporation, dependent: :destroy
    has_many :preferred_offerings, dependent: :destroy

    accepts_nested_attributes_for :preferred_offerings, allow_destroy: true
    accepts_nested_attributes_for :incorporation, allow_destroy: true
end

class Incorporation < ActiveRecord::Base
  belongs_to :company
end

class PreferredOffering < ActiveRecord::Base
    belongs_to :company
end

控制器和视图是我所讨厌的。

让我们看一下合并视图/控制器。 如果我将其配置为Incorporation has_one :company则将其设置如下:

class IncorporationsController < ApplicationController
  def index
  end

  def new
    @user=current_user
    @incorporation = @user.incorporations.build
    @company = @incorporation.build_company
  end

  def create
    @incorporation =   current_user.incorporations.build(incorporation_params)
  end

  private

  def incorporation_params
    params.require(:incorporation).permit(:title, :trademark_search, :user_id, :employee_stock_options, :submit, :_destroy,
                                                    company_attributes: [:id, :name, :employee_stock_options, :options_pool, :state_corp, :street, :city, :state, :zip, :issued_common_stock, :outstanding_common_stock, :fiscal_year_end_month, :fiscal_year_end_day, :user_id, :_destroy]
                                         )
    end

end

并且视图将是:

<%= simple_form_for @incorporation, html: {id:"incorporationform"}, remote: false, update: { success: "response", failure: "error"} do |f| %>
    (incorporation-specific fields)
    <%= f.simple_fields_for :company do |company| %>
        (Company-specific fields)
    <% end %>
<% end %>

所以我的问题是:

我需要如何修改我的控制器并查看是否要通过incorporations_controller创建一个Company IF Company has_one :incorporation

任何建议将不胜感激。

尽管它不是“ Rails Way”,但是即使@company incorporations#new动作中@company成为您的表单的父代也没有什么错。 您的视图将变为:

<%= simple_form_for @company, html: {id:"companyform"}, remote: false, update: { success: "response", failure: "error"} do |f| %>
  (company-specific fields)
  <%= f.simple_fields_for :incorporation do |incorporation| %>
    (incorporation-specific fields)
  <% end %>
<% end %>

而且您强大的参数会发生变化,因此Company是父级, Incorporation是子级。

另一种选择是简单地通过Company控制器。 您可以创建两个新操作: new_preferred_offeringnew_incorporation 然后,您将在这些操作中创建对象。 或者,您可以传入某种:type参数,以便普通的new动作根据您想要的形式呈现两种形式之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM