このトピックに関するいくつかの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 モデルには何もありません。このプロセスは現在うまく機能しています。