1

我試圖更新一個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' 

對這是什麼原因有什麼想法?所有的幫助表示讚賞

回答

0

問題是與這些行:

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

我爲你想要做什麼有點困惑,但我懷疑你的意思是:

has_many :attributes, :class_name => "MetadataTypeAttributes", :dependent => :destroy 
+0

看起來並不是這樣。我嘗試了你的編輯,現在得到這個錯誤:'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''中。我也編輯過上面,並添加了一個不同的模型,我試圖做同樣的事情,那是有相同的問題。 –

+0

我對你的模型的設置有點困惑。爲什麼元數據有許多屬性和MetadataTypeAttributes。兩者都有模型嗎?如果可能,請發佈相關模型和模型模式的一些解釋。 –

1

對不起,我有點遲到派對,但不能定義名稱爲attributes的關聯,因爲它最終會覆蓋由ActiveRecord自己定義和使用的內置方法attributes

很希望這可以幫助任何碰巧遇到這個晦澀錯誤的人。

相關問題