在我的应用程序中,只有具有管理员角色的用户才可以创建新用户。在新用户表单中,我为可能分配给新用户的每个可用角色都有一个选择框。
我希望使用after_create回调方法将角色分配给用户。如何在after_create方法中访问选择框的选定值?
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
flash[:notice] = 'User creation successful.'
format.html { redirect_to @user }
else
format.html { render :action => 'new' }
end
end
end
在用户模型中,我有:
after_create :assign_roles
def assign_roles
self.has_role! 'owner', self
# self.has_role! params[:role]
end
我收到错误,因为模型不知道是什么角色。
答案 0 :(得分:14)
您可以使用attr_accessor
创建虚拟属性,并将该属性设置为创建操作的一部分。
答案 1 :(得分:4)
简短的回答是,不。你不能将任何参数传递给after_create。
然而,您尝试做的事情非常普遍,还有其他方法。
其中大多数涉及在创建相关对象之前分配关系,并让ActiveRecord处理所有事情。
实现这一目标的最简单方法取决于角色和用户之间的关系。如果是一对多(每个用户都有一个角色),那么让您的用户属于一个角色,并通过表单发送role_id。
<%= f.collection_select :role_id, Role.all, :id, :name %>
如果用户和角色之间存在多对多的关系,则可以通过分配给@ user.role_ids来实现相同的目标
<%= f.collection_select :role_ids, Role,all, :id, :name, {}, :multiple => :true %>
两种情况下的控制器都是
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
flash[:notice] = 'User creation successful.'
format.html { redirect_to @user }
else
format.html { render :action => 'new' }
end
end
end