[英]Devise Redirect After Signup: What is super
我想在注册后重定向到一个页面。
这是我用于设计的 registrations_controller.rb:
class Users::RegistrationsController < Devise::RegistrationsController
include ApplicationHelper
layout "signup_layout", only: [:create, :new]
def create
super
redirect_to("create_company") #Can't use this
end
def new
super
end
def edit
super
end
end
唯一的问题是我不能使用redirect_to("create_company")
因为:
在此操作中多次调用渲染和/或重定向。 请注意,您只能调用渲染或重定向,并且每个操作最多只能调用一次。 还要注意,redirect 和 render 都不会终止动作的执行,所以如果你想在重定向后退出一个动作,你需要做一些类似“redirect_to(...) and return”的事情。
我想知道什么是超级。 因为看起来 super 是试图重定向redirect_to("create_company")
。
我的问题是如何在注册后重定向到页面并在下一页上检索新创建帐户的 user_id。
谢谢你。
来自 ruby-doc.org:
在不带参数和空参数列表的情况下调用,super 使用与用于调用当前方法的那些参数和代码块相同的参数和相同的代码块调用适当的方法。 使用一个或多个参数列表调用,它使用完全指定的参数(包括无,在空括号指示的空参数列表的情况下)调用适当的方法。
super
在您的代码示例中所做的是调用默认的 Devise RegistrationsController 的create
方法,该方法已经包含一个重定向。 当您在最后添加自己的重定向时,您正在创建多个重定向条件。
您似乎不想通过覆盖默认的create
方法来做任何不同的事情,所以您真正应该做的是创建一个after_sign_up_path_for
方法,让 Devise 知道在用户成功注册后重定向到哪里。
删除您覆盖的create
方法并将其添加到您的 registrations_controller.rb
def after_sign_up_path_for(user)
user_path(user)
# you can get the user ID from the passed in user object (user.id)
end
super
用于在子类中覆盖父类方法时调用父类方法:
class Parent
def self.foo *args, **kwargs
puts args.inspect if args.any?
puts kwargs.inspect if kwargs.any?
end
end
class Child < Parent
def self.foo *args, **kwargs
super
end
end
irb(main):052:0> Child.foo(1, 2, 'foo', bar: 'baz')
[1, 2, "foo"]
{:bar=>"baz"}
=> nil
当您不带参数调用super
,它只是将所有接收到的参数和块转发到超类方法。
在设计中,您只需要覆盖after_sign_up_path_for
方法。
def after_sign_up_path_for(user)
new_company_path
end
另一个问题是redirect_to("create_company")
不起作用。 至少不是你想的那样。 redirect_to
接受一个字符串、一个散列或一个模型,并且通常很聪明地弄清楚要做什么。
但是,当您传递字符串时,它要么需要是路径,要么是完整的 URI。 将命名路由的名称作为字符串传递将不起作用。 相反,如果您有命名路由,则需要使用路由助手,例如:
redirect_to new_company_path
如果您使用 rails build in resource
和resource
宏(如果您不是,则应该使用)来创建路由,它将为您创建此类帮助程序。
运行rake routes
查看rake routes
列表和名称。
这就是您的完整控制器的样子。 无需执行create
、 new
和edit
操作,因为您实际上并未进行任何覆盖。
class Users::RegistrationsController < Devise::RegistrationsController
layout "signup_layout", only: [:create, :new]
private
def after_sign_up_path_for(user)
new_company_path
end
end
我遇到了和你类似的情况。 如果用户来自手机,我需要进行特定的重定向。 我将把它留在这里以补充之前的答案:
def after_sign_up_path_for(professional)
Browser.new("Some User Agent")
if browser.device.iphone? || browser.platform.android?
access_not_allowed_path
else
super
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.