我有一个使用 Devise(和 Omniauth)进行身份验证的 Ruby on Rails 应用程序。
我正在尝试与想要从我的应用程序嵌入页面的 iOS 应用程序(不受我控制)集成。这个应用程序需要我的页面具有特定的视觉外观,因此我想创建一组额外的身份验证视图。
在设计文档中挖掘之后,我收集到可能我需要在以下位置创建一个新devise_scope
块routes.rb
:
devise_scope :user do
get "iosapp/users/sign_in" => "devise/sessions#iosapp_new"
post "iosapp/users/sign_in" => "devise/sessions#iosapp_create"
delete "iosapp/users/sign_out" => "devise/sessions#iosapp_destroy"
end
我创建了一组与这些路由相对应的新视图:
app/views/devise/sessions/iosapp_new.html.rb
app/views/devise/sessions/iosapp_create.html.rb
app/views/devise/sessions/iosapp_destroy.html.rb
但是在浏览器中加载/iosapp/users/sign_in会导致 Rails 错误:
undefined method `errors' for nil:NilClass
该错误源于 devise_helper.rb 的第 9 行(https://github.com/plataformatec/devise/blob/master/app/helpers/devise_helper.rb):
module DeviseHelper
# A simple way to show error messages for the current devise resource. If you need
# to customize this method, you can either overwrite it in your application helpers or
# copy the views to your application.
#
# This method is intended to stay simple and it is unlikely that we are going to change
# it to add more behavior or options.
def devise_error_messages!
return "" if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
...
我显然在这里做错了什么,但无法弄清楚为什么resource
从我的“备用”视图调用时未定义。似乎我可能还需要创建其他控制器方法,但我在文档中找不到任何关于此的内容。
我偏离轨道了吗?或者有没有比这更好的方法来实现我的目标?