MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoid w/ Rails, attr_accessible --> Aucune méthode trouvée

Ok, j'ai trouvé le problème.

Tout d'abord, je suppose que vous utilisez Rails 4. La raison pour laquelle vous obtenez cette erreur est que attr_protected et attr_accessible ont été retirés de Rails 4 et placés dans leur propre gemme. Rails encourage désormais un nouveau modèle de protection. Vous pouvez lire à ce sujet dans le README . Si vous souhaitez continuer à utiliser l'ancien comportement, vous devez inclure le protected_attributes gem . J'espère que ça aide.

EDIT :J'ai ajouté des précisions ci-dessous, car il s'agit probablement d'un problème courant avec les utilisateurs lors de la mise à niveau vers Rails 4.

Si vous souhaitez continuer à utiliser attr_accessible , c'est-à-dire la manière Rails 3, ajoutez simplement gem protected_attributes à votre Gemfile.

Si vous souhaitez commencer à faire les choses à la manière Rails 4, vous ne devez plus utiliser attr_accessible . Au lieu de cela, vous devez déplacer la logique d'autorisation d'attribut dans le contrôleur. Voici un exemple :

class UsersController < ApplicationController
  def create
    # Using params[:user] without calling user_params will throw an error because 
    # the parameters were not filtered. This is just some Rails magic.
    @user = User.new user_params
    if @user.save
      # Do whatever
    else
      render action: :new
    end
  end

  private
  def user_params
    # params.require(:user) throws an error if params[:user] is nil

    if current_user.nil? # Guest
      # Remove all keys from params[:user] except :name, :email, :password, and :password_confirmation
      params.require(:user).permit :name, :email, :password, :password_confirmation
    elsif current_user.has_role :admin
      params.require(:user).permit! # Allow all user parameters
    elsif current_user.has_role :user
      params.require(:user).permit :name, :email, :password, :password_confirmation
    end
  end