0

您好,我目前正在关注 railscast 360 向我的 web 应用程序添加 Facebook 身份验证。一切都很顺利,直到我开始收到此错误:

“SessionsController 中的 NoMethodError#create

未定义的方法 `name=' for #"

app/models/user.rb:6:inblock in from_omniauth' app/models/user.rb:3:in点击'app/models/user.rb:3:in from_omniauth' app/controllers/sessions_controller.rb:3:increate'

我在这个网站上查看了一些不同的答案,但其中很多似乎是用于 Twitter 身份验证,我只是想让 Facebook 正常工作。

我在 Facebook Developers 上创建了一个应用程序,并完全按照铁路演员的教程进行操作。对于这方面的任何帮助,我将不胜感激。

到目前为止我的代码是

用户.rb:

class User < ActiveRecord::Base
def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.name = auth.info.name
    user.oauth_token = auth.credentials.token
    user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    user.save!
  end
end
end

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  rescue ActiveRecord::RecordNotFound
 end
    helper_method :current_user
end

session_controller.rb

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end
end

这是我在 application.html.erb 中的代码:

 <div id="user_nav">
                <% if current_user %>
                  Signed in as <strong><%= current_user.name %></strong>!
                  <%= link_to "Sign out", signout_path, id: "sign_out" %>
                <% else %>
                <%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %>
                <% end %>

非常感谢任何帮助。

谢谢

4

1 回答 1

0

离开你的调用堆栈跟踪(它是调用的相反顺序),它看起来像你的session_controller调用user模型,特别是用户块。

查看您的代码,没有发现任何错误,但堆栈跟踪正在标记第 6 行并提到它不理解该方法:undefined method 'name='。如果我不得不猜测,表中可能没有名称列 - 这可能无法解决您的问题,但请尝试以下操作:

$ rake db:migrate

$ rails c

然后在 rails 控制台中,尝试检查User对象的字段。

> User.new

希望您知道名称是否列在对象中。

于 2013-05-07T19:31:29.180 回答