4

Я немного в тупике от этого, потому что я чувствую, что уклонился от общих ошибок (например, mistyping the attr_accessible или leaving it out altogether), но я все еще получаюВложенная форма - не может назначить защищенный атрибут

Can't mass-assign protected attributes: home, work 

погрешность здесь. Я предполагаю, что у меня что-то не хватает, но я не уверен, что.

Во всяком случае, в моем новом приложении у Пользователей есть один Дом и одна Работа (каждая из которых принадлежит пользователю), и я хочу, чтобы пользователи вводили их при регистрации. Так, в моей модели:

user.rb

attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :home_attributes, :work_attributes 

    has_one :home, :work 

    accepts_nested_attributes_for :work, :home 

    has_secure_password 

home.rb

attr_accessible :address, :latitude, :longitude, :user_id 
belongs_to :user 

validates :address, presence: true 

work.rb

attr_accessible :address, :latitude, :longitude, :user_id 
belongs_to :user 

validates :address, presence: true 

в мой контроллер

users_controller.rb

def new 
    @user = User.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { redirect_to @user } 
    end 
end 

и в моей форме:

просмотров/пользователей/_form.html.haml

= form_for @user do |f| 
    - if @user.errors.any? 
    .error_explanation 
     %h2 
     = pluralize(@user.errors.count, "error") 
     prohibited this post from being saved: 
     %ul 
     - @user.errors.full_messages.each do |msg| 
      %li= msg 

    = f.label :first_name 
    = f.text_field :first_name 

    = f.label :last_name 
    = f.text_field :last_name 

    = f.label :email 
    = f.text_field :email 

    = f.label :password 
    = f.password_field :password 

    = f.label :password_confirmation, "Re-Enter Password" 
    = f.password_field :password_confirmation 

    = f.fields_for :home do |builder| 
    = builder.label :address, "Home address" 
    = builder.text_field :address 
    %br 
    = f.fields_for :work do |builder| 
    = builder.label :address, "Work address" 
    = builder.text_field :address 

    .btn-group 
    = f.submit 'Sign Up!', class: "btn" 
+0

Это интересно мне, что ошибка говорит, что не может назначить 'дома', когда на самом деле параметр должен быть назван 'home_attributes'. Вы пытались выполнить настройку '@ user.build_home' и' @ user.build_work' в своем новом действии? – awbergs

+0

Я попытался добавить эти две строки - «@home = Home.new» и «@work = Work.new» - в мой контроллер, а затем «f.fields_for @home do | builder |». Это то, что вы имели ввиду? Это протестует аналогично. – Sasha

+1

Отрицательный. Вы хотите специально построить его для вашего объекта @user ('@ user.build_home',' @ user.build_work') – awbergs

ответ

3

Похоже, что вы не настройте свою переменную экземпляра, чтобы включить эти атрибуты.

В контроллере вы должны иметь что-то вроде этого

def new 
    @user = User.new 
    @user.homes.build 
    @user.works.build 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { redirect_to @user } 
    end 
end 

Если вы не строите эти атрибуты формы не знает, что делать.

Edit: Фиксированный синтаксис для создания вложенного ресурса

+0

Когда я пытаюсь, я получаю «undefined method' build »для # " – Sasha

+0

Последнее обновление – muttonlamb

+0

Ha. Теперь: «undefined method' build »для nil: NilClass» :) – Sasha

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