Я использую Ruby on Rails 3.0.7 и у меня проблема с проверкой связанной модели для обновляемого действия контроллера.Я использую ассоциацию has_many: through, чтобы обрабатывать отношения между категориями пользователей.
В модели User
у меня есть:
has_many :user_category_relationships,
:autosave => true,
:dependent => :destroy
has_many :user_categories,
:through => :user_category_relationships,
:source => :user_category,
:dependent => :destroy
В файле просмотра _form
у меня есть:
<% @current_user.user_categories.each do |user_category| %>
<%= check_box_tag :user_category_ids, user_category.id, @user.user_categories.include?(user_category), :name => 'user_relationships[user_category_ids][]' %>
<%= label_tag "user_category_#{user_category.id}", user_category.name %>
<% end %>
В модели UserCategoryRelationship
Ihave:
belongs_to :users
belongs_to :categories
# Validation
validates :name_id,
:presence => true,
:uniqueness => {
:scope => [:created_by_user_id, :category_id]
}
validates :category_id,
:presence => true,
:uniqueness => {
:scope => [:created_by_user_id, :name_id]
}
validates :created_by_user_id,
:presence => true,
:uniqueness => {
:scope => [:category_id, :name_id]
}
В UsersController
у меня есть:
def create
...
# `params[:user_relationships][:user_category_ids]` used below are id values
# related to user-category relationships.
unless params[:user_relationships][:user_category_ids]
# Set default user category if not selected.
@user.user_category_relationships.build(
:category_id => '1',
:created_by_user_id => @current_user.id,
:name_id => @name.id
)
else
params[:user_relationships][:user_category_ids].each { |user_category_id|
@user.user_category_relationships.build(
:category_id => user_category_id,
:created_by_user_id => @current_user.id,
:name_id => @name.id
)
}
end
if @user.save
...
end
end
def update
...
# Note: The following code is equal to that in the controller 'create'
# action. However here is my problem because validation (read after
# for more information about).
unless params[:user_relationships][:user_category_ids]
# Set default user category if not selected.
@user.user_category_relationships.build(
:category_id => '1',
:created_by_user_id => @current_user.id,
:name_id => @name.id
)
else
params[:user_relationships][:user_category_ids].each { |user_category_id|
@user.user_category_relationships.build(
:category_id => user_category_id,
:created_by_user_id => @current_user.id,
:name_id => @name.id
)
}
end
if @user.update_attributes(params[:user])
...
end
end
Приведенный выше код работает за исключением действия update
: когда я пытаюсь запустить, я получаю всегдата же ошибка, также .
# Validation errors on updating the 'user_category_relationships' associated model
:"user_category_relationships.category_id" =>["has already been taken"]
:"user_category_relationships.name_id" =>["has already been taken"]
:"user_category_relationships.created_by_user_id" =>["has already been taken"]
То, что я хотел бы сделать , так как я не использую "магический \ автоматический способ RoR" вообще (то есть я не использую метод collection_singular_ids
- см. также this и this ), для правильной работы update
действие контроллера, так что я все еще могу использовать «автоматическое» создание отношений пользовательской категории (срабатывает на save
и update_attributes(...)
методах) , но не генерировать вышеуказанные ошибки проверки (то естьсоздать действительные данные в таблице базы данных). Как я могу это сделать?Что вы посоветуете по этому вопросу?
PS: Я попал в беду в действии update
, точно выясняющем, как "выбирать" \ "фильтровать" и "кодировать" записи дляобновить, создать и удалить в базе данных, имеющей в качестве входных данных параметры [: user_relationships] [: user_category_ids].