我試圖更新一個ActiveRecord,這看起來應該很容易。方法我在想我Rails 3.1:嘗試更新ActiveRecord:NoMethodError:未定義的方法`鍵'爲#<ActiveRecord :: Relation:0x007fdfb82aca98>
控制器(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
的routes.rb:
match '/metadata_type/:id' => 'metadata#update_metadata_type', :via => [:put], :as => 'update_metadata_type'
每一次我在一家PUT命令發送使用RESTClient的數據,用適當的標題發送JSON,具有以下數據:
{
"name" : "NewName"
}
我也在控制器中使用了binding.pry來確保@me tadata_type被發現(而不是零),它看起來總是正確的:
[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">
PARAMS也期待權:
[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'
對這是什麼原因有什麼想法?所有的幫助表示讚賞
看起來並不是這樣。我嘗試了你的編輯,現在得到這個錯誤:'NameError:未初始化的常量MetadataType :: MetadataTypeAttributes from /Users/dsavage/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/ base.rb:1341:在compute_type''中。我也編輯過上面,並添加了一個不同的模型,我試圖做同樣的事情,那是有相同的問題。 –
我對你的模型的設置有點困惑。爲什麼元數據有許多屬性和MetadataTypeAttributes。兩者都有模型嗎?如果可能,請發佈相關模型和模型模式的一些解釋。 –