Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当用户点击时设计可确认的行为;“确认”;多次链接_Ruby On Rails_Devise_Devise Confirmable - Fatal编程技术网

Ruby on rails 当用户点击时设计可确认的行为;“确认”;多次链接

Ruby on rails 当用户点击时设计可确认的行为;“确认”;多次链接,ruby-on-rails,devise,devise-confirmable,Ruby On Rails,Devise,Devise Confirmable,我用的是designe confirmatible。我遇到了一个问题,即如果用户多次单击确认链接(即,如果用户忘记他们已经确认或其他),他们会收到一个严重错误: NoMethodError at /confirmation undefined method `new_user_registration_path' for <ActionDispatch::Routing::RoutesProxy:0x007fe739a40510> NoMethodError at/确认 未定义的

我用的是designe confirmatible。我遇到了一个问题,即如果用户多次单击确认链接(即,如果用户忘记他们已经确认或其他),他们会收到一个严重错误:

NoMethodError at /confirmation
undefined method `new_user_registration_path' for  <ActionDispatch::Routing::RoutesProxy:0x007fe739a40510>
NoMethodError at/确认
未定义的方法“新用户注册路径”
这是确认链接:

<%= link_to 'Confirm my account', confirmation_url(@user, host: @host, confirmation_token: @user.confirmation_token) %>

理想的行为是闪现[:警报]=“您已经确认”+重定向到登录页面

我试着创建自己的
确认\u controller.rb
并修改路线,但没有成功


提前感谢您的帮助

在发现一个几乎相同的问题后,我自己解决了这个问题:

将Desive批发中的
confirmations\u controller.rb
复制到我的应用程序中不起作用,但调用
super
进行
create
等操作,然后指定一个新的
show
操作起作用

class ConfirmationsController  < Devise::ConfirmationsController

  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to
            after_confirmation_path_for(resource_name, resource) }
    else
      flash[:notice] = "Your account is already confirmed. Please login."
      redirect_to '/login'
    end
  end

end
类确认控制器
默认情况下,Desive将用户重复到达确认页面(使用相同的确认令牌)视为错误条件。我认为避免该消息的最简单方法是重写designe::Models::Confirmable中的
pending\u any\u confirmation
方法。从该方法中删除将其标记为错误条件的行应该可以做到这一点

假设您有一个用户模型,在
app/models/User.rb文件中插入以下内容:

private

def pending_any_confirmation
  if (!confirmed? || pending_reconfirmation?)
    yield
# else
#   self.errors.add(:email, :already_confirmed)
#   false
end

注意:我显示了注释的行,这样您就可以看到Desive的原始方法中到底发生了什么变化。相反,您的方法可能只有一行:
如果(!confirm?| | pending| reconfirmation?)

有一件事您可以改进。由于您的控制器继承自Desive的控制器,因此无需指定所有这些操作并调用
super
。如果类缺少方法,它将尝试将该方法调用委托给父对象。因此,您应该删除所有只调用
super
的操作,留下一个简单的控制器,只需执行
show
操作。如果有人使用了坏的或过期的令牌,此解决方案仍会将他们引导到登录页面,说明他们的帐户已确认。如果您只是在
确认/new
页面上显示
,则它将显示正确的错误消息,如
配置/locales/designe.en.yml
文件中所述。