2012-06-16 1 views
1

В нашем приложении rails 3.1.4 есть пользовательские (родительские) и пользовательские уровни (дочерние) модели.Как НЕ сохранить как родительскую, так и дочернюю запись, если связанная дочерняя запись недействительна в рельсах 3.1.4?

class User < ActiveRecord::Base 
    attr_accessible :name, :login, :password, :user_levels_attributes, :as => :role_new 
    has_many :user_levels 
    ccepts_nested_attributes_for :user_levels, :allow_destroy => true, :reject_if => proc { |a| a['position'].blank? } 
    validates_associated :user_levels 
end 

class UserLevel < ActiveRecord::Base 
    belongs_to :user 
    validates_presence_of :position 
end 

Столбец позиции в user_level должен быть заполнен. Если это не так, то пользовательские и user_levels НЕ должны быть сохранены. Проблема с вышеизложенным заключается в том, что он всегда вызывает ошибку «позиция не может быть пустой», даже если в параметрах есть значение позиции.

{"utf8"=>"✓", 
"user"=>{"name"=>"tester ceo", 
"login"=>"testceo", 
"update_password_checkbox"=>"[FILTERED]", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]", 
"user_levels_attributes"=>{"1339886115748"=>{"position"=>"ceo"}}}, 
"commit"=>"Save"} 

После удаления user_levels_attribues, модель экономит пользователя в таблице пользователей, независимо от того, какого рода user_levels заполняется Int. Мы провели обширный онлайн-поиск и еще не нашли решение. Например, если validates_presence_of: user_levels добавляется в пользовательскую модель, то ни один из уровней пользователя не может быть сохранен или обновлен даже с допустимой позицией.

Любое предложение о том, как реализовать организованное сохранение/обновление двух связанных моделей? Спасибо.

ОБНОВЛЕНИЕ: _user_level.html.erb:

<div class="fields"> 
    <%= f.input :position, :collection => return_position, :prompt => "Choose position", 
         :label => false, :include_blank => true, :selected => i_id %> 
    <%= link_to_remove_fields "remove", f %> 
</div> 

_form_new.html.erb:

<%= simple_form_for @user do |f| %> 
    <%= f.input :name, :label => 'name:' %> 
    <%= f.input :login, :label => 'login:', :hint => '6 digits ' %> 
    <%= f.input :password, :label => 'password:', :hint => '6digits', :input_html => {:id => 'new_user_password'} %> 
    <%= f.input :password_confirmation, :label => 'confirmation:' %> 
    <%= f.input :user_type, :label => 'user type:', :collection => return_user_type, :include_blank => true %> 
    &nbsp;&nbsp;position: 
    <p><%= link_to_add_fields "Choose position", f, :user_levels %></p> 

    <p><%= f.button :submit, 'Save' %></p> 
<% end %> 

Вот метод, чтобы добавить поле позиции:

#add user position in system user creation 
    def link_to_add_fields(name, f, association) 
    new_object = f.object.class.reflect_on_association(association).klass.new 
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
     render :partial => association.to_s, :locals => {:f => builder, :i_id => 0} 
    end 
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{j fields}\")") 
    end 

JS файл:

function add_fields(link, association, content) { 
    var new_id = new Date().getTime(); 
    var regexp = new RegExp("new_" + association, "g") 
    $(link).parent().before(content.replace(regexp, new_id)); 
} 
+0

Как выглядят ваши тесты в этом случае? – thisfeller

+0

Мы используем rspec. Сбой теста с той же ошибкой, что «позиция не может быть пустой». – user938363

+0

Попробуйте проверить страницу в firebug перед отправкой, чтобы узнать, есть ли дополнительные части пользователя на странице. –

ответ

1

Мне кажется, вам нужно удалить :reject_if и изменить validates_associated :user_levels на validates_presence_of :user_levels.

+0

По-прежнему такая же ошибка: «Пользовательские уровни не могут быть пустыми», с позицией «ceo» в параметрах. Благодарю. – user938363

+0

@ user938363 Я замечаю, что идентификатор в хэш-символе user_levels_attributes выглядит довольно высоким ... вы что-то делаете с AJAX для динамического добавления user_levels в форму? Если это так, убедитесь, что шаблон user_levels удален из формы. –

+0

Да, он динамически добавляет user_level с частичной формой (field_for). Я не совсем понимаю, что вы подразумевали для того, чтобы «шаблон user_levels был удален из формы». Если частичная форма user_level удалена из пользовательской формы ввода, мы не можем вводить данные для user_level. – user938363

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

  • Нет связанных вопросов^_^