2012-06-16 52 views
1

在我們的rails 3.1.4應用程序中,有用戶(父級)和user_levels(子級)模型。當關聯的子記錄在rails 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中的position列必須被填充。如果不是,則不應保存user和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添加到用戶模型中,則即使使用有效的位置,也不能保存或更新任何用戶級別。

有關如何實施兩個關聯模型的協調保存/更新的任何建議?非常感謝。

UPDATE: _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 file:

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

嘗試在提交之前檢查螢幕中的頁面,以查看頁面上是否存在額外的user_levels部分。 –

回答

1

我認爲你需要刪除:reject_if並將validates_associated :user_levels更改爲validates_presence_of :user_levels

+0

同樣的錯誤:「用戶級別不能爲空」,位置爲參數「ceo」。謝謝。 – user938363

+0

@ user938363我注意到,「user_levels_attributes」哈希中的id看起來相當高...您是否正在做一些帶有AJAX的動態添加user_levels到窗體?如果是這樣,請檢查user_levels模板是否從表單中刪除。 –

+0

是的,它是用部分表單(field_for)動態添加user_level。我不太明白你的意思,「user_levels模板已從表單中刪除」。如果user_level部分表單從用戶輸入表單中刪除,我們無法輸入user_level的數據。 – user938363

相關問題