MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoid mit Schienen, attr_accessible --> Keine Methode gefunden

Ok, ich habe das Problem gefunden.

Zunächst einmal nehme ich an, dass Sie Rails 4 verwenden. Der Grund, warum Sie diesen Fehler erhalten, ist, dass attr_protected und attr_accessible wurden aus Rails 4 entfernt und in einem eigenen Juwel platziert. Rails fördert nun ein neues Schutzmodell. Sie können darüber in der README nachlesen . Wenn Sie das alte Verhalten weiterhin verwenden möchten, müssen Sie das protected_attributes gem einbinden . Hoffe das hilft.

BEARBEITEN:Ich habe unten eine Klarstellung hinzugefügt, da dies wahrscheinlich ein häufiges Problem bei Benutzern ist, die auf Rails 4 aktualisieren.

Wenn Sie attr_accessible weiterhin verwenden möchten , d. h. auf Rails 3, fügen Sie einfach gem protected_attributes hinzu zu Ihrem Gemfile.

Wenn Sie anfangen möchten, die Dinge auf Rails 4-Art zu erledigen, müssen Sie attr_accessible nicht mehr verwenden . Stattdessen müssen Sie die Attributberechtigungslogik in den Controller verschieben. Hier ist ein Beispiel:

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