Ruby on rails 使用';有很多:通过';唱片协会
我使用的是RubyonRails3.0.7,我在更新控制器操作的相关模型验证方面遇到了问题。我正在使用“has_many:through”关联,以便处理用户类别关系 在Ruby on rails 使用';有很多:通过';唱片协会,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我使用的是RubyonRails3.0.7,我在更新控制器操作的相关模型验证方面遇到了问题。我正在使用“has_many:through”关联,以便处理用户类别关系 在用户型号中,我有: has_many :user_category_relationships, :autosave => true, :dependent => :destroy has_many :user_categories, :through => :user_catego
用户
型号中,我有:
has_many :user_category_relationships,
:autosave => true,
:dependent => :destroy
has_many :user_categories,
:through => :user_category_relationships,
:source => :user_category,
:dependent => :destroy
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]
}
在\u表单
查看文件中,我有:
<% @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 %>
在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
上面的代码除了更新
操作外都有效:当我尝试运行时,也总是会出现相同的错误
我想做的是,因为我根本没有使用“RoR魔法\自动方式”(即,我没有使用该方法-另请参见和),使更新
控制器操作正常工作,以便我仍然可以使用用户类别关系的“自动”创建(在保存
和更新属性时触发)(…)
方法),但避免生成上述验证错误(即在数据库表中创建有效数据)。我该怎么办?您对此问题有何建议?
注意:我遇到的麻烦是在
更新操作中,精确地计算出如何“选择”“筛选”和“编码”要更新的记录,如何在数据库中创建和删除具有参数[:user\u relationships][:user\u category\u id]作为输入数据。你能把表单视图的代码放进去吗?你能把表单视图的代码放进去吗?handle的post的代码已经_并且_属于_许多样式assoc都很旧了!你可以从magic开始检查这一点。我等着你查看表单,然后再告诉你更多的处理方法this@Dinatih-我更新了问题,包括视图文件代码。但是,我的问题是RoR不“理解”更新那些category\u id
、name\u id
和由用户创建的相同的记录(也就是说,数据库中已经存储了具有这些属性的记录)。而不是尝试创建新记录。@Dinatih-我想使用视图文件中的复选框输入字段来更新数据库中的用户组关系。关系应该是:如果选中了复选框输入字段,但数据库中不存在这些关系,则创建;如果未选中复选框,则删除这些复选框,并重新关联关系存在于数据库中;如果选中复选框输入字段并且这些关系存在于数据库中,则不受影响。我希望以“良好”的方式实现这一点好的,还有一件事:user_categories对象的类别是什么?如果它们是类别对象,为什么不将@user.user_categories命名为user@user.categories?如果谈论UsersController或UserCategorityRelationshipsController,是否要编辑用户并为其分配类别列表(如果是,为什么要使用@current_user)或编辑UserCategoryRelationship并为其分配用户和类别?(表单视图来自user或UserCategoryRelationship)
# 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"]