发送邀请后如何更改重定向路径?
How do I change the redirect path after invitation is sent?
我正在使用 Devise Invitable,我在 SO (here is one) 上找到了一些答案,它们说我应该在我的 Users::InvitationsController < DeviseController
.[=19 中指定操作 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)
请注意,它永远不会重定向到任何地方。
我想通了。无论出于何种原因,在我的 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 惯用的...但它可以满足我的需要。
我正在使用 Devise Invitable,我在 SO (here is one) 上找到了一些答案,它们说我应该在我的 Users::InvitationsController < DeviseController
.[=19 中指定操作 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)
请注意,它永远不会重定向到任何地方。
我想通了。无论出于何种原因,在我的 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 惯用的...但它可以满足我的需要。