2012-01-26 3 views
0

У меня есть следующие модели:ActiveRecord не экономить полные вложенные данные

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 

Контроллер:

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> 

Все проявляется как должно быть. Однако, когда я сохраняю запись, AR не сохраняет вложенный атрибут в соответствующей модели. Он сохраняет только основной идентификатор. то есть:

innovators_medios 
------------------------- 
innovator_id | medio_id 
------------------------- 
     23  | 
     23  | 
     23  | 
     23  | 
------------------------- 

Консоль журнала показывает WARNING: Can't mass-assign these protected attributes: medio_id

Что может быть не так?

+0

Приложение находится на Ruby 1.8.7 и Rails 2.3.5 – betacar

ответ

0

Я думаю, ваша проблема в том, что вы используете защищенный атрибут класса InnovatorsMedio. Rails определяют некоторую доступность для защиты полей от массового присвоения.

Попробуйте положить attr_accessible :medio_id на ваш класс InnovatorsMedio и сообщить, устраните ли это проблему.

+0

Я сделал это. Но это блокирует другие атрибуты. An даже не сохраняет это attr. : / – betacar

0

Пробег: attr_accessible :medio_id, :innovator_id.

С attr_accessible документа:

Задает белый список атрибутов модели, которые могут быть установлены с помощью массового назначения.

Как и attr_protected, роль атрибутов необязательна, если не указана роль , тогда используется значение по умолчанию. Роль можно определить, используя опцию : as.

Это противоположность макроса attr_protected: массовое присвоение устанавливает только атрибуты в этом списке, для назначения остальным атрибутам вы можете использовать методы прямого написания. Это предназначено для защиты чувствительных атрибутов от их перезаписи вредоносными пользователями, которые изменяют URL-адреса или формы . Если вы предпочитаете использовать все открытые по умолчанию и , ограничьте атрибуты по мере необходимости, посмотрите на attr_protected.

0

The: через документы свидетельствуют о том, что: primary_key опция игнорируется через таблицы:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

И этот старый пост (есть и другие) указывает на возможность того, что установка первичного ключа в сквозную стол не работает так, как уже в 2.3.8 (или более поздней версии):

http://railsforum.com/viewtopic.php?id=36186

Хотя, кажется, что ваш Erro Сообщение r указывает на что-то другое.

Смежные вопросы