Как использовать вложенные атрибуты с моделью устройства - PullRequest
10 голосов
/ 23 августа 2010

У меня та же проблема, что и Создание дополнительной связанной модели с Devise (которая не имеет ответа).

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

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

У меня есть следующее (сокращено, чтобы сделать его читабельным):

routes.rb

map.devise_for :users
map.resources :users, :has_many => :companies

user.rb

has_many :companies
accepts_nested_attributes_for :companies
devise :registerable ... etc

company.rb

belongs_to :user

new.html.erb

...
<% form_for resource_name, resource, :url => registration_path(resource_name) do |f| %>
...
  <% f.fields_for :company do |company_form| %>
    <p><%= company_form.label :name %></p>
    <p><%= company_form.text_field :name %></p>
  <% end %>
...

UPDATE: Я не добавил: company в список attr_accessible в модели User.

Ответы [ 3 ]

16 голосов
/ 22 сентября 2010

Вы можете добавить следующий метод к модели User:

user.rb

def with_company
  self.companies.build
  self
end

И изменить вид:

new.html.erb

...
<% form_for [resource_name, resource.with_company], :url => registration_path(resource_name) do |f| %>
...
  <% f.fields_for :company do |company_form| %>
  ...
  <% end %>

Таким образом, у вас будет вложенная форма для добавления одна компания к пользователю. Чтобы динамически добавлять несколько компаний к пользователю, проверьте Railcast # 197 by Ryan Bates . Убедитесь, что вы передаете пару ресурсов в виде массива, в противном случае вы получите сообщение об ошибке: «неверное количество аргументов (3 для 2)».

2 голосов
/ 23 августа 2010

Возможно, вы пытаетесь массово назначить некоторую защищенную переменную, ИЛИ, возможно, вы не сохраняете действительную запись.Убедитесь, что запись действительно сохраняется в БД.

0 голосов
/ 07 декабря 2011

Я понял, что это очень старая тема, но так как я нашел лучшее решение, отсюда и ответ.

Просто измените new.html.erb следующим образом,

<% form_for(resource, :as => resource_name,:url => registration_path(resource_name) do |f| %>
    ...
    <% prefix = "user[company_attributes]"%>
    <% fields_for prefix, @user.company do |company_form| %>
    ...
    <% end %>
<% end %>

Таким образом, когда вызывается @ user.save, он также запускает company.save со всеми проверками, которые вы можете иметь в модели компании.

У меня нет большого опыта в RoR, но я думаю, что это лучшее решение. Как вы думаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...