2016-01-21 5 views
0

Я проверил многочисленные сообщения здесь и применил десятки ответов без успеха. Итак, вот он ... сохранил это просто ... включая использование simple_form.Невозможно назначить защищенные атрибуты в ассоциации has_one в Rails 3.2

В моей модели пользователя у меня есть:

has_one :instrument 
accepts_nested_attributes_for :instrument 
attr_accessible ... :instrument_attributes 

В моей модели инструмента у меня есть:

belongs_to :user 
attr_accessible :user_id, :do_inst1, :do_inst2, :do_inst3, :do_inst4 

В моей UsersController у меня есть:

def new 
    @user = User.new 
    @user.build_instrument 
end 

def create_user 
    @user = User.new(params[:user]) # <== THE LINE PRODUCING THE ERROR 

    respond_to do |format| 
    if @user.save 
     format.html {redirect_to users_path, notice: "User created successfully."} 
    else 
     format.html { render action: "new" } 
    end 
    end 
end 

В моем новом пользователе _form .html.erb У меня есть:

<%= simple_nested_form_for :user, url: create_user_users_path do |f| %> 
    <%= f.input :first_name %> 
    <%= f.input :last_name %> 

    <%= f.fields_for :instrument do |instrument_f| %> 
     <%= instrument_f.check_box :do_inst1 %> 
     <%= instrument_f.check_box :do_inst2 %> 
     <%= instrument_f.check_box :do_inst3 %> 
     <%= instrument_f.check_box :do_inst4 %> 
    <% end %> 

    <%= f.button :submit, "Register User" %> 
<% end %> 

Ошибка Msg: Может не массовый Присвоить защищенные атрибуты: инструмент приложение/контроллеры/users_controller.rb: 51: в `новый» линии 51 показан сверху, «# < == ЛИНИЯ, производящего ERROR»

+0

Можете ли вы разместить определение '@ user.build_do_instrument'. – vee

+0

С каким атрибутом у вас возникла проблема? Можете ли вы опубликовать сообщение об ошибке? –

+0

Чтобы сделать его менее запутанным, я изменил «do_instrument» на «инструмент» всего за 1 место. Сожалею. – Jay

ответ

2

Почему вы используете

<%= f.fields_for :do_instrument do |instrument_f| %> 

вместо

<%= f.fields_for :instrument do |instrument_f| %> 

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

puts "*"*30 
puts params 
puts "*"*30 

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

+0

Да ... вы правы. Я пытался упростить синтаксис, изменив «do_instrument» на «инструмент», но я пропустил пару. Я прошу прощения. – Jay