Недопустимые параметры. Разработки + По Протоколу OAuth. Рельсы 4


Rails 4, Devise 3.0.3, Oauth-facebook

Я добавил два дополнительных параметра в мою пользовательскую модель -: name,: uid и пытаюсь сохранить его в моей таблице пользователей из моей формы (route / users/sign_up). Но в результате я получаю запись в таблице, которая содержит только значения по умолчанию для полей: name и: uid вместо значений, которые я помещаю в мои text_fields.

В консоли я получил следующее сообщение:

Unpermitted parameters: name, uid
WARNING: Can't mass-assign protected attributes for User: password_confirmation
app/models/user.rb:31:in `new_with_session'

Вот мой пользователь.модель РБ. Я пытался удалить эти поля из attr_accessible, но это не дает никакого результата.

class User < ActiveRecord::Base
  attr_accessible :oauth_expires_at, :oauth_token, :oauth_secret, :email, :password, :uid, :provider, :name

  default_scope -> {order('created_at ASC')}

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, 
     :omniauthable, :omniauth_providers => [:facebook]

  has_many :microposts, :primary_key => "uid", dependent: :destroy

  # validates :uid, presence: true

  def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
  user = User.where(:provider => auth.provider, :uid => auth.uid).first
  unless user
    user = User.create(name:auth.extra.raw_info.name,
                     provider:auth.provider,
                     uid:auth.uid,
                     email:auth.info.email,
                     password:Devise.friendly_token[0,20]
                     )
  end
  user
  end

  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["user_hash"]
    user.email = data["email"]
      end
    end
  end

end

Вот мой users / omniauth_callbacks_controller.rb (без метода facebook). Я пытался применить различные советы, связанные с before_filter, но это все еще не работает

 class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

 before_filter :configure_permitted_parameters

 def create
    super
 end

 private

 def configure_permitted_parameters
   params.require(:user).permit(:name, :uid, :provider)
 end

 end

Вот мой вид-форма ()

Зарегистрироваться

    <%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>

    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>

      <div><%= f.label :name %> <br /> 
      <%= f.text_field :name, :autofocus => true %></div>

      <div><%= f.label :email %><br />
      <%= f.email_field :email %></div>

      <div><%= f.label :password %><br />
      <%= f.password_field :password %></div>

      <div><%= f.label :password_confirmation %><br />
      <%= f.password_field :password_confirmation %></div>

      <div><%= f.label :uid %><br />
      <%= f.text_field :uid %></div>


      <div><%= f.submit "Sign up" %></div>
    <% end %>

    <%= render "devise/shared/links" %>
Не могли бы вы мне помочь, я не понимаю, что я делаю не так. Как настроить белый список для моих сильных параметров, чтобы получать правильные значения (которые пользователь помещает в view-form)?

Весь мой источник код доступен здесь: https://github.com/DavydenkovM/d23m

Заранее спасибо!

Обновление

Я удалил поля attr_accessible и обновил свой контроллер. Но проблема с недопустимыми парами name и uid в одном и том же месте. Теперь мой контроллер выглядит так:

    class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

      before_filter :configure_permitted_parameters, if: :devise_controller?

      def facebook

        @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

        if @user.persisted?
          sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
          flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
          set_flash_message(:notice, :success, :kind => "Facebook") # if is_navigational_format?
        else
          redirect_to root_url if user_signed_in?
          session["devise.facebook_data"] = request.env["omniauth.auth"]
          redirect_to new_user_registration_url
        end
      end

      def create
        super
      end

      #def update
      #  person = current_account.user.find(params[:id])
      #  person.update_attributes!(person_params)s
      #  redirect_to person
      #end

      private

      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:users) do |u|
          u.permit(:name, :email, :password, :password_confirmation, :uid, :provider)
        end
      end
    end

Обновление 2. Я не очень четко понимаю, что такое ресурс в devise_parameter_sanitizer.для(?) а куда мне нужно это назначить ?

2 2

2 ответа:

Пожалуйста, попробуйте следующее.

def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
  user = User.where(:provider => auth.provider, :uid => auth.uid).first
  unless user
    user = User.create(name:auth.extra.raw_info.name,
                     provider:auth.provider,
                     uid:auth.uid,
                     email:auth.info.email,
                     password:Devise.friendly_token[0,20]
                     ).permit!(:name, :uid, :provider)
  end
  user
end

Или

def facebook

 @user = User.find_for_facebook_oauth(request.env["omniauth.auth"].permit!(:name, :uid, :provider), current_user)

   if @user.persisted?
   sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
    set_flash_message(:notice, :success, :kind => "Facebook") # if is_navigational_format?
  else
    redirect_to root_url if user_signed_in?
    session["devise.facebook_data"] = request.env["omniauth.auth"]
    redirect_to new_user_registration_url
  end
end

Тогда попробуйте это

def configure_permitted_parameters
   devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :email, :password, :password_confirmation, :uid, :provider) }
end

attr_accessible недоступна в Rails 4, так как сильные параметры теперь используются по умолчанию. Похоже, вы уже используете сильные параметры, поэтому вам следует просто удалить строку из вашей пользовательской модели с attr_accessible в ней.