有什么办法来配置设计Omniauth多个型号没有STI?
我们的模型的学生和教授,我们不希望使用STI,但现在我们意识到,设计与Omniauth不与多个模型玩好。
.rvm/gems/ruby-1.9.3-p125/gems/devise-2.1.0/lib/devise/rails/routes.rb:384:in `devise_omniauth_callback': Wrong OmniAuth configuration. If you are getting this exception, it means that either: (RuntimeError)
1) You are manually setting OmniAuth.config.path_prefix and it doesn't match the Devise one
2) You are setting :omniauthable in more than one model
3) You changed your Devise routes/OmniAuth setting and haven't restarted your server
我想,而不是写:omniauthable
个别Student
和Professor model
。 你应该生成第三种模式类似Omniuser
并添加:omniauthable
设置它。
class Student < ActiveRecord::Base
has_one :omniuser
end
class Professor < ActiveRecord::Base
has_one :omniuser
end
嗨,我来到这里有一个类似的问题,我碰到这种解决方案,也许我会帮下一个。 在我来说,我有两个色器件模式,使我与omniauth的工作方式不同,我的第一个模型是谁可以用正常的色器件登录的用户或注册omniauth,第二个是一个艺术家,谁才可以定期注册唱了形式,但我仍然会需要omniauth用于验证来自Twitter的一个值,该验证字段(在Twitter的个人资料,很少检查,这意味着如果一个用户名确实是那家伙)。
所以,当我用我来不能有两个色器件omniauthable模型,我只是决定要使用相同的omniauth两种。
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def all
if artist_signed_in? and session["devise.authorize"] == current_artist.email
session["devise.authorize"] = nil
if current_artist.artist_profile.update_from_omniauth(request.env["omniauth.auth"])
if current_artist.artist_profile.verified
flash[:notice] = "You were verified"
else
flash[:alert] = "Twitter go well but you aren't verified there"
end
redirect_to edit_artist_profile_path(current_artist.artist_profile)
else
flash[:error] = "We can't connect with #{request.env["omniauth.auth"].provider.titleize.split(" ").first}"
redirect_to edit_artist_profile_path(current_artist.artist_profile)
end
elsif !user_signed_in?
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => user.provider.titleize.split(" ").first
user.user_profile.from_omniauth(request.env["omniauth.auth"])
sign_in_and_redirect user, :event => :authentication
else
session["count_errors"] = 0 if session["devise.user_attributes"] == nil
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
else
flash[:notice] = "You are already log in #{current_user.email}"
redirect_to root_path
end
end
def after_omniauth_failure_path_for(scope)
if artist_signed_in? and session["devise.authorize"] == current_artist.email
session["devise.authorize"] = nil
edit_artist_profile_path(current_artist.artist_profile)
else
super
end
end
alias_method :twitter, :all
end
对于第一种情况,正常的用户,我们有
elsif !user_signed_in?
它会做的正常过程,一切都只是像每一个指南,但对于第二种情况(在验证领域和艺术家配置文件)我送了一些随机值有点会议
session["devise.authorize"]
我呼吁用新的路线的链接从我的艺术家简介控制器
<%= link_to "Verify with Twitter", artist_profiles_integrate_twitter_path %>
谁给了会议,并重定向到用户omniauth路线
class ArtistProfilesController < ApplicationController
...
def integrate_twitter
session["devise.authorize"] = current_artist.email
redirect_to user_omniauth_authorize_path(:twitter)
end
end
然后,定义了一对夫妇在每个类中的方法与omniauth工作时,首先创建的用户(基于railscast情节“设计 - omniauth修订的”)和第二只是我的艺术家剖面模型更新的领域,你应该重写after_omniauth_failure_path_for (范围),这只是返回的登录失败的路径,使用您更改错误路径(在失败时与Twitter的连接,例如,它会重定向到用户注册路径相同的技术,而会议将围绕一会儿)我们可以有正常的现象,在这一切的情况下清理会话。
希望它能帮助, 问候!
目前,设计的Omniauthable模块不使用多个型号。 无需担心,因为Omniauthable模块而是围绕OmniAuth一个简单的包装。
https://github.com/plataformatec/devise/wiki/OmniAuth-with-multiple-models
目前,设计的Omniauthable模块不使用多个型号。 ( https://github.com/plataformatec/devise/wiki/OmniAuth-with-multiple-models )简单地说,你需要停止依靠色器件通过“omniauthable”做它的魔力,并用手做。 它并不复杂,一旦你得到第一个模型在middelware工作那么作为它归结为只不同型号完全相同的代码很明显怎样程度上多个模型。
必要的步骤:
- 删除omniauthable并制定从devise.rb和模型omniauth安装使用
- 包括OAuth的为middelware(所以你赶上要求它击中的Rails之前)
- 写手动路线 - 易peasy
- 处理响应 - amlost相同的代码,你现在所拥有的
- 处理故障情况(拒绝对OAuth的提供商) - 在middelware建立一个多块
我解决了类似的问题,我已经在这里详细的说明: https://blog.kodius.io/2016/12/20/devise-omniauth-multiple-models/代码中间件OAuth设置是在这里: https://github.com / kodius / OAuth的示例-多机型