2016-10-26 5 views
1

Я пытаюсь настроить драгоценный камень кокона для вложенных форм в моем приложении Rails 5.Rails, Cocoon Gem - неопределенный метод `reflect_on_association 'для NilClass: Class

У меня проблемы с публикацией других, но, похоже, решения, которые с ними работали, не работают для меня.

У меня есть модели для адреса, организации и настройки. Ассоциации являются:

Адрес

belongs_to :addressable, :polymorphic => true, optional: true 

Организация

has_many :addresses, as: :addressable 
     accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true 

Настройки

has_many :addresses, as: :addressable 
    accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true 

Мои настройки контроллера имеет:

def setting_params 
     params.require(:setting).permit(:newsletter, 
     addresses_attributes: [:id, :description, :unit, :building, :street_number, :street, :city, :region, :zip, :country, :time_zone, :latitude, :longitude, :_destroy] 
     ) 
    end 

Мои маршруты:

resources :organisations do 
    namespace :contacts do 
    resources :addresses 
    resources :phones 
    end 
    end 

resources :users, shallow: true do 
    scope module: :users do 
     resources :assign_roles 
     resources :identities 
     resources :org_requests 
     resources :profiles 
     resources :settings do 
     namespace :contacts do 
      resources :addresses 
      resources :phones 
     end 
     end 
    end 

Мой адрес Форма имеет:

Мои настройки формы есть:

<%= simple_form_for [@user, @setting] do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :newsletter, as: :radio_buttons, label: "Subscribe to our newsletter" %> 

    <%= simple_fields_for :addresses do |f| %> 
      <%= f.error_notification %> 
       <%= render 'contacts/addresses/address_fields', f: f %> 
      <%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>  
     <% end %> 
    </div> 
<% end %> 

Ошибка говорит:

undefined method `reflect_on_association' for NilClass:Class 

Эта строка будет выделена в сообщении об ошибке:

   <%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>   

Для других проблема заключается в использовании единственного числа вместо множественного числа; или с помощью @addresses вместо: адреса (хотя некоторые из решений предложили его должны быть @ вместо:.

Я попытался каждый из них в каждой комбинации

Может кто-нибудь увидеть, что мне нужно. сделать, чтобы установить это?

ПРИНИМАТЬ Эдмунд ПРЕДЛОЖЕНИЕ

Я могу видеть из простой формы документации, вложенных атрибуты должны обрабатываться по-разному в формах.

https://github.com/plataformatec/simple_form/wiki/Nested-Models#example-for-strong-parameters

Я попытался изменить форму:

<%= simple_fields_for "addresses_attributes[]", address do |f| %> 

Это не работает либо. Я не могу сделать страницу для проверки.

Строка ошибки в этом контексте указывает на проблему с новым действием в контроллере организации.То есть:

def new 
    @organisation = Organisation.new 
    @organisation.addresses_build 
    end 

сообщение об ошибке говорит:

undefined method `addresses_build' for #<Organisation:0x007fcf6ff25f08> 
Did you mean? addresses 

мне вот интересно, если мне нужно построить address_attributes вместо адреса. Но когда я пытаюсь, я получаю сообщение об ошибке:

undefined method `addresses_attributes_build' for #<Organisation:0x007fcf72c26d68> 
Did you mean? addresses_attributes= 
+0

Является ли ваша модель 'Setting' или' Settings'? – SteveTurczyn

+0

setting.rb ................ – Mel

ответ

0

Вы должны написать

f.simple_fields_for :addresses 

f относится к форме, и вам это нужно, чтобы иметь возможность перебора всех потомков-адресов.

А во-вторых, лучше иметь link_to_add_association вне цикла (в противном случае вы можете только добавить новый адрес, если уже есть один?)

Так написать что-то вроде

<%= f.simple_fields_for :addresses do |f| %> 
    <%= render 'contacts/addresses/address_fields', f: f %> 
<% end %> 
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>  

(imho пример, который вы называете в документации простой формы, устарел и сложная форма не нужна)

1

Эта ошибка из Активной записи. Вот документация этого метода в Rails 4.2.7. Не должно быть большое изменение в Rails 5.

http://apidock.com/rails/v4.2.7/ActiveRecord/Reflection/ClassMethods/reflect_on_association

Кокон с помощью, чтобы определить класс владельца вашей полиморфного модели. Вы можете проверить это, выполнив следующие действия в консоли.

Address.reflect_on_association(:addressable) 

Это даст вам полиморфные ассоциации отражение

Address.reflect_on_association(:setting) 

Это возвращает ноль

И ваш accepts_nested_attributes_for полагается на этот метод, чтобы найти детей /, принадлежащих классу. См. Исходный код здесь.

http://apidock.com/rails/v4.2.1/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for

И ваша форма гнездится адрес в настройках. Таким образом, он не может найти класс parent/owner.

+1

Хорошо, но означает ли это, что мне нужно что-то сделать, чтобы присвоить идентификатор установки/организации адресуемому значению в моей модели адресов? Я не уверен, что Ive сделал неправильно, чтобы получить эту ошибку. – Mel

+1

@Mel Я не помню точного синтаксиса. но попробуйте 'simple_fields_for: addresses_attributes' –

+0

Спасибо. Это тоже не работает. В документах кокона говорится: f.simple_fields_for: tasks do | task | - вот что я сделал - но это не работает. – Mel