在after_create过滤器中获取当前用户

时间:2012-02-26 21:48:58

标签: ruby-on-rails ruby-on-rails-3

我知道在模型中获取current_user是个坏主意。我也知道有办法(使用Thread)。但是,我不想这样做(这当然是一个坏主意),所以我想对以不同的方式实现这一点有意见。

用户可以创建一个战队,在创建战队时,他必须是领导者。 Clan模型是:

class Clan < ActiveRecord::Base
    after_create :assign_leader

    # the person who created the clan is the leader
    def assign_leader
      self.clan_memberships << ClanMembership.new(:user_id => ???, :role => 'leader')
    end
end

我知道我可以在控制器中创建成员资格。但是,我喜欢过滤器充当交易,我更喜欢这个过滤器。但是,在这里真的有一种正确的,非“黑客”的做法吗?

1 个答案:

答案 0 :(得分:4)

分配控制器中的领导者:

@clan.leader = @clan
@clan.save

然后你的模型看起来像这样:

class Clan < ActiveRecord::Base
  belongs_to :leader
  after_create :assign_leader

# the person who created the clan is the leader
def assign_leader
  self.clan_memberships.create(:user => self.leader)
end

这意味着您可以检查领导者clan.leader,而不必查询clan.memberships之类的其他关联,以找出是谁。它还可以使assign_leader中的代码更清晰。

当然,您需要将leader_id作为字段添加到clans表中。