2013-06-16 8 views
8
  • Wygenerowane Szyny App w/out Active Record
  • Dodano odpowiednie perełki dla Mongoid (MongoDB & Mongoid)
  • Wygenerowany plik mongoid.yml w config/z wspierać szyny
  • stworzył model przyjaciel i kontroler użytkownika z typowych tras CRUD

wszystko działa z wyjątkiem, gdy próbuję zrobić masową zadanie uzyskać: "undefined method `attr_accesible' for Friend:Class" Mongoid w/Rails, attr_accessible -> "Nie sposób znaleźć"

modelu, friend.rb:


    class Friend 
     include Mongoid::Document 
     field :first_name, :type => String 
     field :last_name, :type => String 
     field :adjective, :type => String 
     attr_accessible :first_name, :last_name, :adjective 
    end 
 
development: 
    sessions: 
    default: 
     database: first_development 
     hosts: 
      - localhost:27017 
     options: 
     options: 
test: 
    sessions: 
    default: 
     database: first_test 
     hosts: 
     - localhost:27017 
     options: 
     consistency: :strong 
     max_retries: 1 
     retry_interval: 0 

Myśli?

+0

Link "http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-andmonmonbmongoid.html" mówi, aby dodać attr_accessor: dostępny pod linią attr_accessible. Powodem jest to, że "#: available" jest zmienną używaną do przechowywania specyficznych dla gry pól dynamicznych, dzięki czemu można je ustawić poprzez przypisanie masy za pomocą attr_accessible, co umożliwia dynamiczne ustawienie attr_accessible. " – user1455116

+0

Też napotykam ten sam problem. Sugestia @ user1455116 nie działa. Którą wersję prowadnic i mongoid używasz? – Max

Odpowiedz

26

Ok, znalazłem problem.

Przede wszystkim zakładam, że używasz Railsów 4. Powodem, dla którego otrzymujesz ten błąd jest to, że attr_protected i attr_accessible zostały usunięte z Rails 4 i umieszczone w ich własnym klejnocie. Rails zachęca teraz do nowego modelu ochrony. Możesz przeczytać o tym w README. Jeśli chcesz nadal używać starego zachowania, musisz dołączyć protected_attributes gem. Nadzieja, która pomaga.

EDIT: Dodałam wyjaśnienie poniżej, ponieważ może to być wspólny problem z użytkownikami uaktualnieniem do szyn 4.

Jeśli chcesz nadal korzystać attr_accessible, czyli Rails 3 way, wystarczy dodać gem protected_attributes do Twojego Gemfile.

Jeśli chcesz zacząć robić rzeczy w stylu Rails 4, nie możesz już używać attr_accessible. Zamiast tego musisz przenieść logikę uprawnień atrybutów do kontrolera. Oto przykład:

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 
+0

Twoje założenie jest poprawne - używam szyn 4. Sprawdzę to, gdy wejdę na moją maszynę programistyczną – sircapsalot

+0

Hej, więc zgodnie z plikiem Readme, który łączyłeś, wygląda na to, że model ochrony znajduje się wewnątrz szyn. https://github.com/rails/strong_parameters#compatibility Mówi, że jest teraz dostarczany z szynami, więc nie powinienem używać żadnego klejnotu, aby to działało. – sircapsalot

+0

Plik README był dla gem 'strong_parameters', który jest aktualnym standardem Rails 4. Drugi link to gem gem "protected_attributes". Atrybut 'protected_attributes'gem zawiera metodę' attr_accessible', ale 'protected_attributes' został usunięty z Rails 4.Jeśli chcesz nadal używać metody 'attr_accessible' w szynach 4, musisz dodać do Gemfile następujące elementy:' gem 'protected_attributes'' – Max