我遇到的情况是我的一个嵌套字段被传递给参数但没有被插入到表中。
我的模型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 %>
控制器中的new
和create
方法如下
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_id
,id
,created_at
和updated_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
因此,某些参数不会与表插入相关联(如果这是有意义的话)。可能会发生什么?
感谢任何想法。
答案 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