如何处理 Rails 中的嵌套表单?

Posted

技术标签:

【中文标题】如何处理 Rails 中的嵌套表单?【英文标题】:How to handle nested forms in Rails? 【发布时间】:2015-07-02 21:51:43 【问题描述】:

大家好,我正在使用 cocoon gem 构建嵌套表单。

has_many :filled_cartridges, inverse_of: :request, dependent: :destroy
accepts_nested_attributes_for :filled_cartridges, allow_destroy: true

这是我的请求模型。

request.html.erb里面我有:

<%= f.fields_for :filled_cartridges do |filled_cartridge| %>
   <fieldset class="nested-fields"> 
     <%= filled_cartridge.autocomplete_field :cartridge_name, autocomplete_cartridge_cartridge_name_requests_path, :update_elements =>  %>
     <%= filled_cartridge.hidden_field :_destroy %>
     <%= link_to_remove_association "удалить", f %>
   </fieldset>  
<% end %>

强参数:

def request_params
  params.require(:request).permit(:name, :address,:filled_cartridges_attributes => [:client_id,:cartridge_name,:cartridge_id,
                :request_id,:count,:fill_date,:_destroy,:id],)
end

所以我有 destroy 和 id 参数以便能够销毁记录。 我想在一个实例中处理我的请求和填充墨盒模型。多亏了accepts_nested_attributes,我相信我可以做到这一点。

问题是它无法保存fill_Cartridge:

SQLite3::ConstraintException: NOT NULL constraint failed: filled_cartridges.client_id

我猜问题出在控制器方法内部:

@request = Request.new( request_params )
@client = Client.where("name = ?", @request.name).take

if params[:request][:filled_cartridges_attributes].present? and params[:stype_ids].present?
    if params[:stype_ids].include? '1'
        params[:request][:filled_cartridges_attributes].each do |_,value|
            if @client.present?
                value[:client_id] = @client.id
            else
                value[:client_id] = 0
            end
                value[:request_id] = 0  #временный id
                @cartridge = Cartridge.where('cartridge_name=?', "#value[:cartridge_name]").take
            if @cartridge.nil?
                @cartridge = Cartridge.create!(:cartridge_name => "#value[:cartridge_name]")
        end
            value[:cartridge_id] = @cartridge.id
            value[:cartridge_name] = @cartridge.cartridge_name
        end
    end
end

注意:我可以设置像 value[:parm] = something 这样的参数吗

【问题讨论】:

你试过了吗? &lt;%= filled_cartridge.autocomplete_field :cartridge_name, autocomplete_cartridge_cartridge_name_requests_path, :update_elements =&gt; %&gt;&lt;%= filled_cartridge.hidden_field :_destroy %&gt; @Amit Sharma,顺便说一句,这只是错字,该字段集最初是部分的。忽略它 为什么这个问题同时被标记为ruby-on-rails-4 和ruby-on-rails-3.2? 【参考方案1】:

问题与您的嵌套表单无关,它与您的 SQLite 架构中的非空约束有关。传入您的 client_id 以验证约束或从 db 中删除约束

【讨论】:

是的,但是我无法为 client_id 分配一些值的问题,并且删除约束只会让记录以空值保存。但我需要价值观。

以上是关于如何处理 Rails 中的嵌套表单?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue:如何处理具有不同架构的嵌套 JSON

如何处理 GraphQL 中的嵌套输入

如何处理没有其他关系的实体中的嵌套对象

如何处理嵌套的属性列表

ApolloClient:你如何处理缓存中的规范化/嵌套?

如何处理 Oracle 中的 1 级深度嵌套限制?