Я прочитал несколько ссылок SO по этой теме. Даже если вы можете взломать его, чтобы получить current_user в модели, вы не должны этого делать. Итак, каковы мои варианты в моем случае?
Я использую гем devise_invitable, и одна из команд — 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, и мне больше ничего не нужно было делать. Этот процесс работает отлично сейчас!
invite!
? Как сохранить приглашенного пользователя? Если вы сделаете что-то вродеUser.invite!(email: email, invited_by: current_user)
, вы не получите доступ кcurrent_user
в модели: модель не знает, чтоinvited_by
установлено вcurrent_user
, знает только контроллер. - person eirikir   schedule 13.09.2015User.invite!(email: email, invited_by: current_user)
в модели, потому что он не знает current_user. Мне просто интересно, какой обходной путь я мог бы сделать, чтобы devise_invitable знал, кто отправил приглашение. - person iamse7en   schedule 13.09.2015