2014-11-24 3 views
0

Вот моя модельПочему ActiveModel :: ForbiddenAttributesError ошибка?

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 

Вот мой контроллер

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 

Я попытался глядя в базу данных, если какая-либо дубликат запись была сделана. Но нет. Пожалуйста, дайте мне знать, если вы можете помочь.

+0

пожалуйста, добавьте свой журнал сервера. Так что это может объяснить ваши проблемы более конкретно – Rubyrider

+0

Я преодолел проблему. Теперь он говорит, что таблица пользователя не существует. @Rubyrider – mlemboy

+0

, то каким-то образом вы сделали такие операции или ваша база данных была удалена. Запустите миграцию или посмотрите, нужно ли снова запустить rake db: setup. – Rubyrider

ответ

0

Просто измените где (условие) для:

where(provider: auth.provider, uid: auth.uid) 

1-й подход терпит неудачу из-за метода #permitted? который AR вызывает (если определено) для дезинфекции атрибутов.

> h = auth.slice(:provider, :uid) 
> h.class 
=> OmniAuth::AuthHash < Hashie::Mash 
> h.permmitted? 
> false 

Однако простой хэш не будет #передано? определяется, таким образом, он просто будет продолжать:

> h = { provider: auth.provider, uid: auth.uid } 
> h2.permitted? 
NoMethodError: undefined method `permitted?' for {:provider=>"facebook", :uid=>"XXXX"}:Hash 

Ссылка: https://github.com/rails/rails/blob/master/activemodel/lib/active_model/forbidden_attributes_protection.rb#L19)