【问题标题】:Devise methods undefined in Rails project在 Rails 项目中设计未定义的方法
【发布时间】:2016-12-09 17:24:24
【问题描述】:

我有一个安装了 Devise gem 的 Rails 5 应用程序。我的项目是这样设置的,所有的控制器都是命名空间的......甚至是设计控制器。

在我的路由文件中我已经这样做了(这将更好地解释我的命名空间结构):

controllers: {
    sessions: "api/v1/public/members/users/sessions",
    passwords: "api/v1/public/members/users/passwords",
    registrations: "api/v1/public/members/users/registrations",
},
path_names: { 
  sign_in: 'login', 
  password: 'forgot', 
  sign_up: 'register',
  sign_out: 'signout'
}

我还设置了设计视图文件以反映所需的命名空间结构。

我在 ApplicationController.rb 中包含以下内容:

before_action :authenticate_api_v1_public_members_user!

由于我的 Devise 控制器是命名空间的,因此标准的“before_action :authenticate_user!”方法需要更新为上述方法才能工作。

我遇到的问题是,我的任何视图中都没有任何 Devise 辅助方法可用。调用“current_user”或“user_signed_in”时?在视图中,刷新浏览器时出现“未定义方法”错误。我也尝试对这些辅助方法进行命名空间,但无济于事。

更新 模型在我的应用程序中没有命名空间。我正在使用普通的用户模型。只有控制器是命名空间的,并且结构如上面的路由所示。

有人遇到过类似问题吗?

【问题讨论】:

  • :authenticate_api_v1_public_members_user!看起来很奇怪!这个 Devise 助手应该与你的命名空间无关。方法的名称取决于您的用户模型的名称。从您的示例中,我可能猜到您的用户模型是 ApiV1PublicMemberUser
  • 我在这里得到了命名空间身份验证方法的提示:stackoverflow.com/a/29409283/1933068。我还更新了我的问题以解释模型@chumakoff
  • 如果真的这样工作,你必须使用方法current_api_v1_public_members_user!api_v1_public_members_user_signed_in?而不是current_user!user_signed_in?
  • 哇,你的建议真的奏效了。我之前做过类似的事情,但是我的单词顺序不正确。您能否将此添加为答案,以便我将其标记为已接受。谢谢@chumakoff
  • 我很惊讶它是这样工作的。有新东西要知道。谢谢!我创建了一个答案

标签: ruby-on-rails ruby devise ruby-on-rails-5


【解决方案1】:

似乎 Devise 嵌套在您的 routes.rb 中的 :api_v1_public_members 命名空间中。在这种情况下,它不仅会影响authenticate_user! 方法,将其更改为authenticate_api_v1_public_members_user!,还会影响其他方法。

  • current_user 转为current_api_v1_public_members_user

  • user_signed_in? 转为api_v1_public_members_user_signed_in?

这里有类似的问题undefined method `authenticate_user! Api::PostsController in Devise / Rails 4

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多