2013-06-16 2 views
8
  • Сформированные Rails App ж/из Active Record
  • Добавлены соответствующие драгоценные камни для Mongoid (MongoDB и Mongoid)
  • Сгенерированный файл mongoid.yml в конфиг/с рельсами поддержки
  • создал друг модель и контроллер пользователя с типичными CRUD маршрутами

Все работает, за исключением, когда я пытаюсь сделать массовое назначение, я получаю: "undefined method `attr_accesible' for Friend:Class" Mongoid ж/Rails, attr_accessible -> "Ни один метод не найден"

Модель, 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 

Мысли?

+0

Ссылка «http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-and-mongodbmongoid.html» говорит, чтобы добавить attr_accessor: доступный ниже линии attr_accessible. Причина в том, что «#: доступный - это переменная, используемая для хранения игровых динамических полей, так что они могут быть установлены через массовое присвоение через attr_accessible, что позволяет устанавливать attr_accessible динамически». – user1455116

+0

Я также сталкиваюсь с той же проблемой. Предложение @ user1455116 не помогло. Какую версию рельсов и мангой вы используете? – Max

ответ

26

Хорошо, я нашел проблему.

Прежде всего, я предполагаю, что вы используете Rails 4. Причина, по которой вы получаете эту ошибку, состоит в том, что attr_protected и attr_accessible были удалены из Rails 4 и помещены в их собственный камень. Rails теперь поощряет новую модель защиты. Вы можете прочитать об этом в README. Если вы хотите продолжать использовать старое поведение, вы должны включить protected_attributes gem. Надеюсь, это поможет.

EDIT: Я добавил пояснение ниже, так как это, скорее всего, является общей проблемой с пользователями обновления на рельсы 4.

Если вы хотите продолжать использовать attr_accessible, то есть Rails 3 так, просто добавьте gem protected_attributes в ваш Gemfile.

Если вы хотите начать делать вещи Rails 4, вы больше не должны использовать attr_accessible. Вместо этого вы должны переместить логику разрешения атрибута в контроллер. Вот пример:

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

ваше предположение верно - я использую рельсы 4. Я проверю это, когда я получу на своей машине разработки – sircapsalot

+0

Эй, поэтому в соответствии с подключенным readme, кажется, что модель защиты находится внутри рельсов. https://github.com/rails/strong_parameters#compatibility. Он говорит, что теперь он связан с рельсами, поэтому мне не нужно использовать какой-либо камень для выполнения этой работы. – sircapsalot

+0

Файл README предназначен для драгоценного камня 'strong_parameters', который является текущим стандартом Rails 4. Вторая ссылка связана с драгоценным камнем 'protected_attributes'. 'Protected_attributes'gem содержит метод' attr_accessible', но 'protected_attributes' был удален из Rails 4.Если вы хотите продолжить использование метода 'attr_accessible' в rails 4, вы должны добавить следующее в свой Gemfile:' gem 'protected_attributes'' – Max

Смежные вопросы