从子控制器创建父模型

时间:2015-09-18 23:57:26

标签: ruby-on-rails ruby-on-rails-4 model nested-forms

我正在研究一个收集有关公司信息的网络应用程序。可以为PreferredOffering(库存)或Incorporation提供信息。换句话说,当我为这些模型中的任何一个创建新条目时,就形成了一个新的公司。

如果PreferredOfferingIncorporationCompany的孩子,即使我正在尝试浏览preferred_offerings_controller或{{}},我的数据库也更清晰了{1}}创建新的incorporations_controller。这就是我的问题;我正在试图弄清楚如何配置我的视图和控制器以从子控制器创建父模型。我已经完成了一些研究,并且已经看到两个other S/O posts关于如何使用Rails 3实现这一点,但是看起来强大的params的添加增加了另一层复杂性。

所以我的模型设置如下

Company

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

创建incorporations_controller

我们非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

虽然它不是“Rails方式”,但将@company作为表单中的父级并没有什么不妥,即使它位于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是父,Incorporation是孩子。

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