1

Rails 3.1.4アプリには、user(親)モデルとuser_levels(子)モデルがあります。

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と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が入力されていても、userをusersテーブルに保存します。私たちは広範囲にわたるオンライン検索を行いましたが、まだ解決策を見つけていません。たとえば、validates_presence_of:user_levelsがユーザーモデルに追加された場合、有効な位置であっても、どのユーザーレベルも保存または更新できません。

2つの関連するモデルの組織化された保存/更新を実装する方法について何か提案はありますか?本当にありがとう。

更新:_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));
}
4

1 に答える 1

1

:reject_ifを削除してに変更validates_associated :user_levelsする必要があると思いますvalidates_presence_of :user_levels

于 2012-06-16T22:33:00.197 に答える