Rails 3.1: Попытка обновить ActiveRecord: NoMethodError: неопределенный метод "keys" для # - PullRequest
1 голос
/ 16 ноября 2011

Я пытаюсь обновить ActiveRecord, который, кажется, ДОЛЖЕН быть достаточно легким.Методы, которые я пробовал в моем

контроллере (metadata_controller.rb) :

  def update_metadata_type
    @metadata_type = MetadataType.find(params[:id])
    if @metadata_type.update_attributes(params)
      render :template => 'metadata/show_metadata_type'
    else
      # return error template
    end
  end

  def update_metadata_type
    if MetadataType.update(1, { :name => params[:name] })
      render :template => 'metadata/show_metadata_type'
    else
      # return error template
    end
  end

  def update_metadata_type
    @metadata_type = MetadataType.find(params[:id])
    @metadata_type.name = params[:name]
    @metadata_type.save

    render :template => 'metadata/show_metadata_type'
  end

Модель (metadata_type.rb):

class MetadataType < ActiveRecord::Base
  has_many :metadata_type_attributes, :dependent => :destroy
  has_many :attributes, :through => :metadata_type_attributes, :dependent => :destroy

  attr_accessible :name, :attribute_type_id

  validates :name, :uniqueness => true
end

Другая модель с той же проблемой (attribute_type.rb):

class AttributeType < ActiveRecord::Base
  belongs_to :attributes

  attr_accessible :data_type

  validates :data_type, :uniqueness => true
end

rout.rb:

  match '/metadata_type/:id' => 'metadata#update_metadata_type', :via => [:put], :as => 'update_metadata_type'

Каждый раз, когда я отправляю данные, используя RESTClient , с соответствующими заголовками для отправки json, со следующими данными вКоманда PUT:

{
    "name" : "NewName"
}

Я также использовал binding.pry в контроллере, чтобы убедиться, что @metadata_type найден (а не nil) и всегда выглядит правильно:

[1] pry(#<MetadataController>)> @metadata_type = MetadataType.find(params[:id])
=> #<MetadataType id: 1, name: "Category", created_at: "2011-11-15 16:02:53", updated_at: "2011-11-15 16:02:53">

Параметры также выглядят правильно:

[7] pry(#<MetadataController>)> params
=> {"name"=>"NewName",
 "controller"=>"metadata",
 "action"=>"update_metadata_type",
 "id"=>"1",
 "metadatum"=>{"name"=>"NewName"}}

Но по какой-то причине, независимо от того, как я пытаюсь сохранить, я получаю ту же ошибку:

NoMethodError (undefined method `keys' for #<ActiveRecord::Relation:0x007fdfb7637fd8>):
  app/controllers/metadata_controller.rb:50:in `update_metadata_type'

Есть идеи о том, что это вызывает?Вся помощь приветствуется

Ответы [ 2 ]

1 голос
/ 22 августа 2013

Извините, я немного опоздал на вечеринку, но вы не можете определить ассоциацию с именем attributes, так как оно заканчивается переопределением встроенного метода доступа attributes, определенного и используемого самим ActiveRecord.

Надеюсь, это поможет любому, кто столкнется с этой неясной ошибкой.

0 голосов
/ 16 ноября 2011

Проблема с этими строками:

has_many :metadata_type_attributes, :dependent => :destroy
has_many :attributes, :through => :metadata_type_attributes, :dependent => :destroy

Я немного смущен тем, что именно вы пытаетесь сделать, но я подозреваю, что вы имеете в виду:

has_many :attributes, :class_name => "MetadataTypeAttributes", :dependent => :destroy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...