Используя has_one с условием, чтобы найти связанный объект, но как вы создаете связанный объект? - PullRequest
2 голосов
/ 20 марта 2012

У меня есть модель учетной записи со следующим:

has_one :primary_user, :class_name => "User", :conditions => "role = 'primary_user'"

Итак, @ account.primary_user ищет пользователя с ролью primary_user.

При создании новой учетной записи я хочу иметь возможность создать нового primary_user.Что такое «путь Rails» для этого?

Нужно ли создавать метод primary_user =?

Вот моя форма создания ..

<%= semantic_form_for @account do |f| %>
    <%= f.input :account_name %>

    <%= f.semantic_fields_for :primary_user do |user| %>
      <%= user.input :email %>
   <% end %>
<% end %>

Если я отправлю эту форму, я получу

ActiveRecord :: AssociationTypeMismatch (ожидается пользователь (# 2159789500), получен ActiveSupport:: HashWithIndifferentAccess (# 2159703820)):

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Немного чище:

has_one :primary_user, :class_name => "User", :conditions => { :role => "primary_user" }

Тогда прямое решение:

<%= semantic_form_for @account do |f| %>
    <%= f.input :account_name %>

    <%= f.semantic_fields_for :primary_user, primary_user || build_primary_user do |user| %>
      <%= user.input :email %>
   <% end %>
<% end %>

Но я предлагаю вам добавить это в новое действие в контроллере

@account.build_primary_user
0 голосов
/ 20 марта 2012

Это основано на том, что @ fl00r говорит в своем посте ... Я согласен, что правильное место для сборки объектов находится в контроллере.В действии new на вашем AccountsController вам просто нужно добавить строку вроде этой:

@account.primary_user ||= @account.build_primary_user

Таким образом, ваше действие new будет выглядеть примерно так (плюсвсе, что вы добавили):

def new
  @account = Account.new
  @account.primary_user ||= @account.build_primary_user
end

Тогда ваш код для формы создания должен работать как есть.

...