从子控制器创建父模型

Create parent model from child controller

我正在开发一个收集公司信息的网络应用程序。可以获取 PreferredOffering(股票)或 Incorporation 的信息。所以换句话说,当我为这些模型中的任何一个创建一个新条目时,一个新公司就成立了。

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

所以我的模型是这样设置的

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

我不确定控制器和视图。

让我们来看看合并view/controller。 如果我要配置它 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 IF Company has_one :incorporation[=28= 创建一个 Company ]

如有任何建议,我们将不胜感激。

虽然它不是 "Rails Way",但将 @company 作为表单中的 parent 并没有什么错,即使它在 incorporations#new 行动。你的观点会变成这样:

<%= 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 是 parent,Incorporation 是 child。

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