0

このトピックに関するいくつかのSOリンクを読みました。モデルで current_user を取得するためにハッキングできたとしても、それを行うべきではありません。それで、私の場合の私のオプションは何ですか?

私は devise_invitable gem を使用しています。コマンドの 1 つは、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 によって定義されており、他に何もする必要がなかったため、 User モデルには何もありません。このプロセスは現在うまく機能しています。

4

3 に答える 3

1

コードにはいくつかの微妙な問題があります。else最後に作成されたユーザーを追加しようとするコードのブランチで、競合状態が発生する可能性があります。emailsのインスタンスの他の場所からアクセスしない限り、ここでセッターメソッドが必要かどうかもわかりませんGroup

他の人が示唆しているように、現在のユーザーをコントローラーからの引数として渡します。がどのように実装されているかはわかりません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 に答える