访问模型中的current_user(或其他一些解决方法)

时间:2015-09-13 02:43:25

标签: ruby-on-rails ruby devise devise-invitable

我已经阅读了有关此主题的几个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.invite已经由devise_invitable定义,我不需要做任何其他事情。这个过程现在很有效!

1 个答案:

答案 0 :(得分:-2)

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