繁体   English   中英

注册后设计重定向:什么是超级

[英]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 resourceresource宏(如果您不是,则应该使用)来创建路由,它将为您创建此类帮助程序。

运行rake routes查看rake routes列表和名称。


这就是您的完整控制器的样子。 无需执行createnewedit操作,因为您实际上并未进行任何覆盖。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM