0

我已经阅读了有关此主题的几个 SO 链接。即使您可以破解它以获取模型中的 current_user,您也不应该这样做。那么,在我的情况下,我有哪些选择?

我正在使用 devise_invitable gem,其中一个命令是User.invite!({:email => email}, current_user),它存储了 ( current_user) 邀请的用户。我想知道这些信息。

目前,用户被邀请加入一个私有组,这个过程在我的group.rb模型中处理:

# group.rb
  def user_emails
  end

  def user_emails=(emails_string)
    emails_string = emails_string.split(%r{,\s*})
    emails_string.each do |email|
      user = User.find_for_authentication(email: email)
      if user
        self.add user
        GroupMailer.welcome_email(user)
      else
        User.invite!(email: email) # But I want this: User.invite!({:email => email}, current_user)
        user = User.order('created_at ASC').last
        self.add user
      end
    end
  end

如果相关,它只是一个 text_area 接收这些电子邮件进行处理:

# groups/_form.html.erb
<%= f.text_area :user_emails, rows: 4, placeholder: 'Enter email addresses here, separated by comma', class: 'form-control' %>

不用重新安排太多,如何User.invite!({:email => email}, current_user)在这个过程中运行,让这个有用的信息(谁被谁邀请)存储在我的数据库中?非常感谢!


更新

在下面@Mohamad 的帮助下,我得到了它的工作。

# group.rb
  def emails
  end

  def invite_many(emails, inviter)
    emails.split(%r{,\s*}).each do |email|
      if user = User.find_for_authentication(email: email)
        add user
        GroupMailer.group_invite user
      else
        add User.invite!({:email => email}, inviter)
      end    
    end
  end

# groups_controller.rb
  def update
    @group = Group.friendly.find(params[:id])
    if @group.update_attributes(group_params)
      emails = params[:group][:emails]
      @group.invite_many(emails, current_user) # also put this in #create
      redirect_to @group
    else
      flash[:error] = "Error saving group. Please try again."
      render :edit
    end
  end

然后在我的 User 模型中什么都没有,因为 User.invite 已经由 devise_invitable 定义了,我不需要做任何其他事情。这个过程现在工作得很好!

4

3 回答 3

1

您的代码存在一些微妙的问题。else在您尝试添加最后创建的用户的代码分支上存在潜在的竞争条件。我也不确定您是否需要一个 setter 方法,除非您可以emailsGroup.

正如其他人所建议的,将当前用户作为参数传递给控制器​​。我不确定invite!是如何实现的,但假设它返回一个用户,你可以大量重构你的代码。

我会做这样的事情:

def invite_many(emails, inviter)
  emails.split(%r{,\s*}).each do |email|
    if user = User.find_for_authentication(email: email)
      add user
      GroupMailer.welcome_email user
    else
      add User.invite!(email, inviter)
    end    
  end
end

# controller
@group.invite_many(emails, current_user)

# User.invite
def invite(email, inviter)
  # create and return the user here, and what else is necessary
end
于 2015-09-13T15:13:04.883 回答
0

如果您是user_emails()从控制器调用的(我猜您是因为那一定是您收到要传入的表单的地方emails_string),您可以传入current_user

user_emails(emails_string, current_user)

并更改user_emails以接收它:

def user_emails=(emails_string, current_user)

于 2015-09-13T11:43:52.137 回答
-2

您可以将 current_user 存储在全局范围内,例如 @current_user,它可以在会话控制器中分配,因此在模型中您只需将 @current_user 作为应用程序的当前用户。

于 2015-09-13T03:02:36.000 回答