2013-03-08 4 views
2

У меня есть форма регистрации, в которой используется вложенная модель. Клиент может иметь несколько пользователей, а User принадлежит к Client. В форме регистрации я хочу иметь возможность одновременно регистрировать как клиента, так и пользователя. Тем не менее, я продолжаю получать «не могу назначить массу» для пользователя, чего я не понимаю, так как у меня есть accepts_nested_attributes_for :users.Невозможно назначить защищенные атрибуты: user

<h1>Sign Up</h1> 
<%= form_for @client do |client_form| %> 
    <% if @client.errors.any? %> 
    <div class="error_messages"> 
     <h2>Form is invalid</h2> 
     <ul> 
     <% for message in @client.errors.full_messages %> 
      <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="field"> 
    <%= client_form.label :business_name %> 
    <%= client_form.text_field :business_name %> 
    </div> 


    <%= client_form.fields_for :user do |user_form| %> 
     <div class="field"> 
     <%= user_form.label :first_name %> 
     <%= user_form.text_field :first_name %> 
     </div> 
     </div> 
     <div class="field"> 
     <%= user_form.label :last_name %> 
     <%= user_form.text_field :last_name %> 
     </div> 
     <div class="field"> 
     <%= user_form.label :username %> 
     <%= user_form.text_field :username %> 
     </div> 
     <div class="field"> 
     <%= user_form.label :password %> 
     <%= user_form.password_field :password %> 
     </div> 
     <div class="field"> 
     <%= user_form.label :password_confirmation %> 
     <%= user_form.password_field :password_confirmation %> 
     </div> 
    <% end %> 

    <div class="actions"><%= client_form.submit %></div> 
<% end %> 


    class Client < ActiveRecord::Base 

    attr_accessible :business_name 
    attr_accessible :users_attributes 

    has_many :users 
    has_many :items 

    accepts_nested_attributes_for :users, allow_destroy: true 

    ... 
    end 

    class User < ActiveRecord::Base 
    attr_accessible :client_id, :first_name, :last_name, :username, :password, :password_confirmation 
    belongs_to :client 

    has_secure_password 
    .... 
    end 

ОШИБКА

ActiveModel::MassAssignmentSecurity::Error - Can't mass-assign protected attributes: user: 
    (gem) activemodel-3.2.11/lib/active_model/mass_assignment_security/sanitizer.rb:48:in `process_removed_attributes' 
    (gem) activemodel-3.2.11/lib/active_model/mass_assignment_security/sanitizer.rb:20:in `debug_protected_attribute_removal' 
    (gem) activemodel-3.2.11/lib/active_model/mass_assignment_security/sanitizer.rb:12:in `sanitize' 
    (gem) activemodel-3.2.11/lib/active_model/mass_assignment_security.rb:230:in `sanitize_for_mass_assignment' 
    (gem) activerecord-3.2.11/lib/active_record/attribute_assignment.rb:75:in `assign_attributes' 
    (gem) activerecord-3.2.11/lib/active_record/base.rb:497:in `initialize' 
    app/controllers/clients_controller.rb:45:in `new' 
    app/controllers/clients_controller.rb:45:in `create' 
    (gem) actionpack-3.2.11/lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    (gem) actionpack-3.2.11/lib/abstract_controller/base.rb:167:in `process_action' 
    (gem) actionpack-3.2.11/lib/action_controller/metal/rendering.rb:10:in `process_action' 
    (gem) actionpack-3.2.11/lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
    (gem) activesupport-3.2.11/lib/active_support/callbacks.rb:414:in `_run__330478543754893527__process_action__2034132490286778675 
__callbacks' 

Что здесь не так?

+0

Можете ли вы высказать свое точное сообщение об ошибке? – Catfish

+0

добавлено сообщение об ошибке – user1322092

ответ

3

Изменить

<%= client_form.fields_for :user do |user_form| %>

в

<%= client_form.fields_for :users do |user_form| %>

Поскольку client_form ссылки на вашу модель клиента и модель has_many :users, вы должны убедиться, что когда вы используете вложенные поля формы, у вас есть :users в качестве символа. Кроме того, убедитесь, что у вас есть attr_accessible :users_attributes в вашей модели клиента.

+0

стоит отметить, что это связано с тем, что поля ввода будут иметь префикс 'client [users] [0]', 'client [users] [1]', ... вместо 'client [user]' – bdares

+0

После смены: пользователь: пользователям, атрибуты пользовательской формы больше не отображаются - только атрибуты формы клиента. Кроме того, для вашей второй рекомендации, я думаю, вы имели в виду «attr_accessible: users_attributes» вместо «accepts_nested_attributes_for: users_attributes». Первый входит в мой пост. С изменением на «: users», обновляюсь ли я для обновления своего метода «def new» Client controller? Я видел еще одну запись, включая дополнительное заявление, «@ client.user = User.new». Это не сработало для меня. – user1322092

+0

Скорее всего, это не отображается, потому что у вас нет пользователей, связанных с клиентом. Вместо этого вы можете использовать jQuery для ввода новых полей формы или вы можете сделать что-то вроде '@ client.users.build' в своем контроллере. Это создаст новое поле пользователя. Я предлагаю вам посмотреть railscasts и искать вложенные формы. Отсутствие полей пользователя - это знак, что это работает должным образом (по иронии судьбы). – kobaltz

-1

Просто догадаться, но помогает ли это изменить одну или обе эти линии?

attr_accessible :users_attributes 
accepts_nested_attributes_for :users, allow_destroy: true 

в

attr_accessible :user_attributes 
accepts_nested_attributes_for :user, allow_destroy: true 
+0

Нет, я получаю сообщение об ошибке «Не найдено никакой ассоциации для имени« пользователь ». Думаю, так как у меня есть «has_many: users». Но даже если я изменю его на «has_many: user», атрибуты формы пользователя больше не отображаются. – user1322092

1

В модели клиента попробуйте добавить этот метод:
Def инициализации (* арг)
self.users.build
конец

ИЛИ

в контроллере нового Действие:
@user = @ client.users.build

+0

Привет, Нилай, ваш ответ '@user = @ client.users.build' также решает проблему, но будет отмечать ответ kobaltz, который накладывается на ваш, как ответ. Спасибо за понимание и помощь в решении этой проблемы! Возможно, я задал другой вопрос о том, как установить значение модели пользователя по умолчанию, когда пользователь вложен в клиентский интерфейс (я полагаю, что пользовательский атрибут по умолчанию используется в клиентской модели). Еще раз спасибо!! – user1322092