Rails:你可以将参数传递给after_create方法吗?

时间:2010-02-09 21:55:40

标签: ruby-on-rails activerecord

在我的应用程序中,只有具有管理员角色的用户才可以创建新用户。在新用户表单中,我为可能分配给新用户的每个可用角色都有一个选择框。

我希望使用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

我收到错误,因为模型不知道是什么角色。

2 个答案:

答案 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