Как изменить путь перенаправления после отправки приглашения?

Я использую Devise Invitable и нашел несколько ответов на SO (вот один), которые говорят, что я должен указать действие after_invite_path_for(resource) в моем Users::InvitationsController < DeviseController.

Я пробовал это, и это все еще не работает.

Это мой контроллер:

class Users::InvitationsController < Devise::InvitationsController

   def after_invite_path_for(resource)
     root_path
   end

   def create
      @member ||= Member.find_or_create_by(email: params[:user][:email], first_name: get_first_name(params[:user][:full_name]), last_name: get_last_name(params[:user][:full_name]), bio: params[:user][:bio], gender: params[:user][:gender])
      @membership ||= Membership.find_or_create_by(member: @member, family_tree: current_user.family_tree, inviter: current_user, relation: params[:user][:invitation_relation])

      if @user_exists ||= invited_user_exists(params[:email])

      else
        super
      end

    end
end

Когда я пытаюсь просто добавить redirect_to root_path сразу после super в блоке else... выдает ошибку о том, что перенаправление уже вызвано.

Я считаю, что это правда, потому что если вы проверите источник создайте здесь действие, вы увидите перенаправление.

Это журнал сервера:

Started POST "/users/invitation" for 127.0.0.1 at 2015-12-02 03:58:57 -0500
Processing by Users::InvitationsController#create as HTML
  Rendered users/mailer/invitation_instructions.html.erb within layouts/mail (1.2ms)

  # truncated for brevity

  Rendered users/invitations/create.html.erb within layouts/devise (0.6ms)
  Rendered shared/_navbar.html.erb (1424.4ms)
Completed 200 OK in 9221ms (Views: 4732.1ms | ActiveRecord: 102.0ms)

Обратите внимание, что он никогда никуда не перенаправляется.


person marcamillion    schedule 02.12.2015    source источник
comment
Возможный дубликат перенаправления Rails Devise Invitable после отправки приглашения   -  person Pardeep Dhingra    schedule 02.12.2015
comment
@PardeepDhingra Это вопрос и ответ, на которые я ссылаюсь в своем вопросе. Вся предпосылка моего вопроса основана на том факте, что другой не работает.   -  person marcamillion    schedule 03.12.2015


Ответы (1)


Я понял это. По какой-то причине выполнение after_invite_path_for(resource) в моем Users::InvitationsController не отменяло действие create в DeviseInvitable#Create.

Итак, что я сделал, так это просто использовал большую часть логики из официального действия создания и просто изменил перенаправление локально.

Итак, теперь мое действие создания в моем контроллере выглядит так:

def create
  @member ||= Member.find_or_create_by(email: params[:user][:email], first_name: get_first_name(params[:user][:full_name]), last_name: get_last_name(params[:user][:full_name]), bio: params[:user][:bio], gender: params[:user][:gender])
  @membership ||= Membership.find_or_create_by(member: @member, family_tree: current_user.family_tree, inviter: current_user, relation: params[:user][:invitation_relation])

  if @user_exists ||= invited_user_exists(params[:email])

  else
    self.resource = invite_resource
    resource_invited = resource.errors.empty?

    yield resource if block_given?

    if resource_invited
      if is_flashing_format? && self.resource.invitation_sent_at
        set_flash_message :notice, :send_instructions, :email => self.resource.email
      end
      redirect_to root_path, notice: "Invitation Successfully Sent."
    else
      respond_with_navigational(resource) { render :new }
    end
  end

end

Это работает. Это не идиоматично Devise... но это работает для того, что мне нужно.

person marcamillion    schedule 03.12.2015