设计 + Omniauth + Facebook
Posted
技术标签:
【中文标题】设计 + Omniauth + Facebook【英文标题】:Devise + Omniauth + Facebook 【发布时间】:2014-05-23 09:43:39 【问题描述】:我已按照 railscasts 视频 #235 和 #236 设置带有设计的 OmniAuth。我可以让一切正常工作,当我在身份验证控制器中添加条件语句时,我的问题就出现了。我收到以下错误:
AuthenticationsController#facebook 中的 NoMethodError :user:Symbol 的未定义方法“to_key” 它似乎在:
sign_in_and_redirect(:user, authentication.user)
我在这里检查了其他答案,但似乎没有一个解决方案。我找到了一个与 Heroku 相关的,但我正在开发中收到此消息。任何帮助将不胜感激。
authentications_controller.rb
脸书 omniauth = request.env["omniauth.auth"] 身份验证 = Authentication.find_by_provider_and_uid(omniauth.provider,omniauth.uid) 如果认证 flash[:notice] = "登录成功。" sign_in_and_redirect(:user, authentication.user) elsif 当前用户 current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) flash[:notice] = "认证成功。" redirect_to authentications_url 别的 @user = User.new @user.apply_omniauth(omniauth) 如果@user.save flash[:notice] = "登录成功。" 登录和重定向(:用户,@用户) 别的 session[:omniauth] = omniauth.except('extra') 重定向到新用户注册网址 结尾 结尾 结束registrations_controller.rb
类 RegistrationsController 设计::RegistrationsController 定义创建 极好的 session[:omniauth] = nil 除非@user.new_record? 结尾 私人的 def build_resource(*args) 极好的 如果会话[:omniauth] @user.apply_omniauth(会话[:omniauth]) @user.valid? 结尾 结尾 结尾routes.rb
资源:身份验证 获取 '/auth/:provider/callback' => 'authentications#facebook' devise_for :users, :controllers => :registrations => 'registrations', :omniauth_callbacks => 'authentications'用户.rb
类用户 ActiveRecord::Base has_many:身份验证 # 包括默认设计模块。其他可用的有: # :confirmable, :lockable, :timeoutable 和 :omniauthable 设计:database_authenticable,:可注册, :recoverable, :rememberable, :trackable, :validatable, :omniauthable def apply_omniauth(omniauth) self.email = omniauth.info.email 如果 email.blank? authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 结尾 def password_required? (authentications.empty?|| !password.blank?) && super 结尾 结尾日志
ActiveRecord::SchemaMigration 负载 (0.9ms) SELECT "schema_migrations".* FROM "schema_migrations" 我,[2014-04-09T20:17:07.296969 #2248] 信息——omniauth:(facebook)请求阶段已启动。 我,[2014-04-09T20:17:07.353447 #2248] 信息——omniauth:(facebook)请求阶段已启动。 我,[2014-04-09T20:17:07.518464 #2248] 信息——omniauth:(facebook)回调阶段已启动。 AuthenticationsController#facebook 处理为 html 参数: “代码”=> “AQC6I3SgbGI86ZBptFdBal5HIE1UHwCt7Zw5FVzGvWtApGhZfxjmXTo-AX3qJGOA_PWOeMK4i05K2yJL4_8bQLaTUjyvOBO4nQHjz2nLv5CTCMg2fPAsveUquO-UdVA8XajfUai9AQ8U8m4tfkwxysnq4n2bGBot2UCmFcfRGDB_b9uoIO8ELj80ltc3T0Vf2wj6XScl_R5m1o3CTUYqUzLQCukyjCb3Mz5_2_cWvHiCJLEiTMWjwccbrqNFhWgFCDNE0sLWZnESFNbdWUvFb_ug0NoXk4JevtQjv9XbW-FBiZ3FACn49grGlum1Z0I6qbI”, “状态”=> “758f521ee2e37251f404435d13e5f194fc7dab59cb412659” 身份验证负载 (2.2ms) SELECT "authentications".* FROM "authentications" WHERE "authentications"."provider" = 'facebook' AND "authentications"."uid" = '578621157' ORDER BY "authentications"."id" ASC限制 1 用户负载 (7.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 3]] 在 124 毫秒内完成 500 内部服务器错误 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (2.3ms) 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.2ms) 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.9ms) 在救援/布局中渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (35.6ms)【问题讨论】:
我还查看了设计和omniauth 文档,但似乎找不到解决方案。 【参考方案1】:问题在于哈希格式。我改了:
sign_in_and_redirect(:user, authentication.user.user_id)
这样就解决了。
【讨论】:
【参考方案2】:改变
sign_in_and_redirect(:user, authentication.user)
到
sign_in_and_redirect(authentication.user)
【讨论】:
更改导致新错误:AuthenticationsController#facebook 中的 RuntimeError 找不到 nil 的有效映射 你能分享为这个错误生成的服务器日志吗?将其发布在问题中。以上是关于设计 + Omniauth + Facebook的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 3 中设置环境变量(设计 + Omniauth)