【问题标题】:How do I change the redirect path after invitation is sent?发送邀请后如何更改重定向路径?
【发布时间】:2015-12-02 09:09:04
【问题描述】:

我正在使用 Devise Invitable,我在 SO (here is one) 上找到了一些答案,说我应该在我的 Users::InvitationsController < DeviseController 中指定操作 after_invite_path_for(resource)

我试过了,还是不行。

这是我的控制器:

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

当我尝试在 else 块中的 super 之后添加一个 redirect_to root_path 时......它会引发关于重定向已调用的错误。

我相信这是真的,因为如果您检查 create action here 的来源,您会看到重定向。

这是服务器日志:

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)

请注意,它永远不会重定向到任何地方。

【问题讨论】:

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


【解决方案1】:

我想通了。无论出于何种原因,在我的Users::InvitationsController 中执行after_invite_path_for(resource) 并没有覆盖DeviseInvitable#Create 中的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 惯用的……但它可以满足我的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2023-03-28
    • 2017-01-20
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多