Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord未保存完整的嵌套数据_Ruby On Rails_Ruby_Activerecord_Nested Attributes - Fatal编程技术网

Ruby on rails ActiveRecord未保存完整的嵌套数据

Ruby on rails ActiveRecord未保存完整的嵌套数据,ruby-on-rails,ruby,activerecord,nested-attributes,Ruby On Rails,Ruby,Activerecord,Nested Attributes,我有以下型号: class Innovator < ActiveRecord::Base has_many :innovators_medios, :dependent => :destroy, :autosave => true has_many :medios, :through => :innovators_medios accepts_nested_attributes_for :innovators_medios, :allow_destroy =&

我有以下型号:

class Innovator < ActiveRecord::Base
  has_many :innovators_medios, :dependent => :destroy, :autosave => true
  has_many :medios, :through => :innovators_medios
  accepts_nested_attributes_for :innovators_medios, :allow_destroy => true, :reject_if => lambda { |a| a['medio_id'].eql? 0 || a['medio_id'].blank? }

  attr_accessor :list_medios

  def self.nuevo
    @new = self.new

    @new.list_medios = Medio.all

    @new.list_medios.count.times { @nuevo.innovators_medios.build }

    @new
  end
end

class InnovatorsMedio < ActiveRecord::Base
  belongs_to :innovator
  belongs_to :medio

  set_primary_key :medio_id
end
日志控制台显示警告:无法批量分配这些受保护的属性:medio_id


可能有什么问题?

我认为您的问题在于您使用的是InnovatorMedio类的受保护属性。Rails定义了某种可访问性,用于保护字段不受批量分配的影响

尝试将attr\u accessible:medio\u id放在您的innovator medio类上,并告知这是否解决了您的问题。

尝试attr\u accessible:medio\u id,:innovator\u id

从属性可访问文档:

指定可通过设置的模型属性的白名单 质量分配

与attr_protected类似,如果没有角色,属性的角色也是可选的 然后提供:使用默认值。可以使用 :作为选项

这与attr_保护宏相反:质量分配将 仅设置此列表中的属性,以指定给其余属性 您可以使用直接编写器方法。这是为了保护敏感的 防止被恶意用户篡改的属性覆盖 URL或表单。如果你想从一个完全开放的默认 根据需要限制属性,查看attr_protected


:through文档建议对through表忽略:primary_键选项:

这篇较老的文章还指出,在一个直通表中设置主键可能在2.3.8或更高版本时不起作用:


尽管您的错误消息似乎指向其他内容。

该应用程序在Ruby 1.8.7和Rails 2.3.5上,我已经完成了。但这是其他属性。安甚至不保存该属性:/
class InnovadorsController < ApplicationController
  ...

  def new
    @innovator  = Innovator.nuevo
  end

  ...
end
<% form_for @innovator do |f| %>
  <%= f.error_messages %>

  ...  

  <section id="paso-1">
    <div class="page-header">
      <h1>Datos del postulante</h1>
    </div>
    <div class="row">      
        ...                 
        <%= render :partial => 'datos_personales', :locals => { :dato => f } %>   
        ...   
    </div>      
  </section>
<% end %>
  ...
  <div class="clearfix">
    <%= dato.label :innovadors_medios_id, '¿Cómo se enteró del programa de estímulo a la innovación e investigación?' %>
    <div class="input">
      <ul class="inputs-list">
      <% i = 0 %>
      <% dato.fields_for :innovadors_medios do |im| %>
        <%= render :partial => 'medios/new', :locals => { :medio => im, :nombre => @innovator.list_medios[i].nombre, :id => @innovator.list_medios[i].id } %>
        <% i += 1 %>
      <% end %>
      </ul>
    </div>
    ...

<li id="medio-<%= id %>">
  <label>
    <%= medio.check_box :medio_id, {}, id, 0 %>
    <span><%= nombre %></span>
  </label>
</li>
   innovators_medios
-------------------------
 innovator_id | medio_id
-------------------------
       23     |
       23     |
       23     |
       23     |
-------------------------