嵌套属性未插入表中

时间:2016-01-16 11:40:53

标签: ruby-on-rails postgresql ruby-on-rails-4 rails-activerecord nested-attributes

我遇到的情况是我的一个嵌套字段被传递给参数但没有被插入到表中。

我的模型Company has_one :incorporation。无论如何,公司现在有一个字段,嵌套在Company表格中,如下所示

<%= simple_form_for @company, url: url_for(action: @caction, controller: 'incorporations'), html: {id:"incorporationform"}, remote: false, update: { success: "response", failure: "error"} do |company| %>
    ...
    <%= company.simple_fields_for :incorporation do |f| %>
        <div class="padded-fields">
            <div class="form_subsection">
                <%= f.input :trademark_search, as: :radio_buttons, label: 'Would you like us to do a trademark search and provide advice regarding any issues we identify in relation to the name you have selected?', input_html: { class: 'form-control radio radio-false' } %>
            </div>
        </div>
    <% end %>
    ...
<% end %>

控制器中的newcreate方法如下

def new
    @user=current_user
    @company = @user.companies.build
    @incorporation = @company.build_incorporation
    @action = "new"
    @caction = "create"
    @remote=false
end

def create
    @snapshot="incorporation"
    @company = current_user.companies.build(company_params)
    @incorporation = @company.build_incorporation

    if @company.save
        current_user.companies << @company
        if params[:final_submit]
            redirect_to incorporations_index_path
        else
            redirect_to edit_incorporation_path(@incorporation), notice: "Successfuly saved incorporation info."
        end
    else
        render 'new', notice: "Something went wrong; form unable to be saved."
    end
end

问题是当我在简单字段中选择其中一个单选按钮时,日志显示数据已发送到参数:

 Parameters: {"utf8"=>"✓",..., "company"=>{..."incorporation_attributes"=>{"trademark_search"=>"0"}},...}

但它没有被插入表中。相反,会插入一个新条目,但仅包含company_ididcreated_atupdated_at,所有条目都非常准确。没有无效的参数错误或类似的东西。

我强大的参数看起来像这样:

def company_params
        params.require(:company).permit(:id, :name,...,incorporation_attributes: [:title, :trademark_search, :user_id, :employee_stock_options, :final_submit, :submit, :_destroy],...)
end

因此,某些参数不会与表插入相关联(如果这是有意义的话)。可能会发生什么?

感谢任何想法。

3 个答案:

答案 0 :(得分:2)

好的,有些代码丢失,但我认为问题在于:

@company = current_user.companies.build(company_params)
@incorporation = @company.build_incorporation

在第一行中,您可以创建公司模型以及公司模型(存在于company_params中)。但是,第二行会覆盖您的合并模型,而不使用任何数据。从incorporation belongs_to company开始,丢弃包含所有数据的初始值。

解决方案:完全删除第二行,一切正常。

其他错误:

您不需要这一行:

current_user.companies << @company

@company已经构建在current_user.companies范围内,这意味着它已经属于current_user。这不会导致任何明显的错误,这只会浪费服务器的时间。

你在id内也遗漏了incorporation_attributes - 这意味着你永远无法通过嵌套属性更新或删除数据(并且你有_destroy字段,所以我假设你想做这在某些时候)。

答案 1 :(得分:1)

删除此行

@incorporation = @company.build_incorporation

来自create方法。这又是建立(公司)记录。如果创建/更新父对象,嵌套表单将创建关联记录。(公司)。

答案 2 :(得分:1)

你只需要构建&#34;如果您要创建新记录(build记录为空白),则关联对象:

def create
   @company = current_user.companies.new company_params
   @company.save #-> incorporation already set in params