2014-11-13 3 views
0

У меня есть модель структуры следующим образом:рельсы не инициализируется несохраненные вложенные модели

class Client 
    belongs_to :lead 
    accepts_nested_attributes_for :lead 
end 

class Lead 
    has_one :client 
    has_many :defense_practices, through: :some_join_model, source: :practice, source_type: "DefensePractice" 
    accepts_nested_attributes_for :defense_practices 
end 

У меня есть форма структура имеет следующие:

<%= form_for @client do |f| %> 
    <%= f.fields_for :leads do |lead_builder| 
    <%= f.fields_for defense_practices do |practice_builder| 
     <%= practice_builder.text_field :some_field %> 
    <% end %> 
    <% end %> 
<% end %> 

Данные корректно представлены в Params хэша:

Parameters: { 
    "client"=>{ 
     "lead_attributes"=> 
      {"id"=>"45", 
      "defense_practices_attributes"=> 
       {"0"=>{ 
          "some_field"=>"some_value", 
          "id"=>"52" 
         }, 
        "4"=>{ 
          "some_field"=>"some_value" 
         } 
        } 
      } 
     } 
    } 

Вторая практика была добавлена ​​через javascript, используя ту же технику, что и в railscasts n образная модель.

Когда модели инициализируются в действие создания, оборонной практики, которая была добавлена ​​с помощью JavaScript (который несохраненные, как показано отсутствие атрибута ид в приведенном выше хэш) не инициализирован:

def create 
    @client = Client.new client_profile_params 
    puts @client.lead.defense_practices.size # => 1 
    end 

    def client_profile_params 
    params[:client].permit! 
    end 

Особое примечание. В модели клиента мне пришлось переопределить lead_attributes =, потому что у меня есть несохраненная модель клиента с сохраненной моделью, и если я не переопределяю, тогда рельсы жалуются: не удалось найти Lead с ID = 46 для клиента с ID =.

def lead_attributes=(params) 
    if params[:id].present? 
     lead = Lead.find(params[:id]) 
     self.lead = lead 
    else 
     super 
    end 
    end 

Он должен инициализировать две практики защиты. Но он только инициализировал практику защиты, которая уже была связана с этим руководством. Это не добавило новую практику защиты в ассоциацию. Что я делаю не так?

+0

Можем ли мы увидеть ваши 'client_profile_params'? – JTG

+0

def client_profile_params params [: client] .permit! конец @JTG – Donato

ответ

0

Это то, что я называю эффектом пульсации. Одно ограничение в Rails приводит к использованию взлома, который развязывает банку червей. Поскольку Lead был создан до Клиента, я не смог сохранить Клиента с существующим Lead. Поэтому мне пришлось переопределить метод lead_attributes = Rails в моей модели. Ну, делая это, он обошел много внутренних элементов Rails. Я был в состоянии захватить его обратно с помощью update_attributes и переходя в Params хэша:

def lead_attributes=(params) 
    if params[:id].present? 
     lead = Lead.find(params[:id]) 
     lead.update_attributes params 
     self.lead = lead 
    else 
     super 
    end 
    end 

К сожалению, это порождает новые проблемы, но это не решает вопрос, который был задан.

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