我正在尝试建立一个Rails 3应用程序来处理用户角色与设计和CanCan。
我的关系如下
class User < ActiveRecord::Base
has_many :users_roles
has_many :roles, :through => :users_roles
end
class Role < ActiveRecord::Base
has_many :users_roles
has_many :users, :through => :users_roles
end
class UsersRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
实际上一切都很好。设计正在完美地处理身份验证。CanCan基于能力限制用户行为。rb.
但是我有一个可笑的问题设置UsersRole。
我在用户编辑页面上定义了这样的复选框。
<% for role in Role.all %>
<%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %>
<%=h role.name.camelize %>
<% end %>
<%= hidden_field_tag "user[role_ids][]", "" %>
如果我通过控制台创建UserRole,那么这些复选框将根据用户角色被选中。
但是我不能使用这些复选框设置或更改角色!
我一直在房子周围用这个-语法的变化,切换到HABTM和roles_mask方法,重建我的模型和控制器几次-都没有效果。
实际上我的问题的标题不完全正确-复选框上放的是
_method put
authenticity_token XGl6s1iyXJfahdgftc3df8q1ZeehMVzs3LxiQH98jGw=
commit Update
user[current_password] password
user[email] user@example.com
user[name] User Name
user[password]
user[password_confirmatio...
user[role_ids][] 1
user[role_ids][] 4
user[role_ids][]
utf8 ✓
但是这些值没有在数据库中设置。
我做错了什么??!!我猜您已经在用户模型中指定了attr_accessible,并且role_ids没有在那里列出(它不应该)
如果它与控制器中的update_attributes调用相结合,那么role_ids将永远不会正确设置。
如果是这种情况,那么你应该在更新或保存之前手动设置控制器中的role_ids:
@user.role_ids = params[:user][:role_ids]
当然,我不确定情况是否如此,因为您没有在User模型中包含控制器代码或任何细节。
编辑:如果使用@user。update_attributes,您可以将其更改为以下内容:
#The same as update_attributes, but without the save
@user.attributes = params[:user]
# Here the role_ids get assigned manually so it does not need to be in attr_accesible
@user.role_ids = params[:user][:role_ids] if params[:user]
# And here it gets checked if the save was successfull
if @user.save
render :action => :show
else
render :action => :edit
end