2012-02-01 56 views
0

我剛接觸Ruby和rails。我正在做一個更新的形式:硬件數據庫中的所有者值。使用自定義視圖名稱transfer.html.erb。我的表單代碼顯示在下面。rails 3未定義的方法`update_attributes'爲零:NilClass

<%= form_for @hardware, :url => do_transfer_path do |f| %> 

這是hardwares_tranfers_controller.rb

def transfer 
    @hardware = Hardware.find(params[:id]) 
    if current_user.user_lvl == 0 
    @users = User.order(:user_lvl) 
    else 
    @users = User.where(:refer => current_user.id) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @hardwares } 
    end 
    end 
end 


def do_transfer 
# transfer_user = User.where(:id => @hardware.owner).email 
#  TransferLog.create([:user_id => current_user.id, :hardware_id => @hardware.id]) 
    if @hardware.update_attributes(params[:hardware]) 
    format.html { redirect_to users_url, notice: "Hardware was successfully transfer"} 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @hardware.errors, status: :unprocessable_entity } 
    end 
end 

我的自定義控制器和我得到的錯誤是 NoMethodError在HardwaresTransfersController#do_transfer 未定義的方法update_attributes' for nil:NilClass Aplication Traces app/controllers/hardwares_transfers_controller.rb:23:in do_transfer」

參數

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"vkwKyuS4eviRN1ogrpOcGh1Y5OBNX0wiBzpV8taNkq0=", 
"hardware"=>{"owner"=>"3"}, 
"commit"=>"Transfer Hardware"} 

我的routes.rb

match "hardwares_transfers/" => "hardwares_transfers#do_transfer" , :as => :do_transfer 
get "hardwares_transfers/:id/transfer" => "hardwares_transfers#transfer", :as => :transfer_hardwares 

耙路線>

 do_transfer  /hardwares_transfers(.:format)    hardwares_transfers#do_transfer 
transfer_hardwares GET /hardwares_transfers/:id/transfer(.:format) hardwares_transfers#transfer 
     hardwares GET /hardwares(.:format)      hardwares#index 
        POST /hardwares(.:format)      hardwares#create 
     new_hardware GET /hardwares/new(.:format)     hardwares#new 
    edit_hardware GET /hardwares/:id/edit(.:format)    hardwares#edit 
      hardware GET /hardwares/:id(.:format)     hardwares#show 
        PUT /hardwares/:id(.:format)     hardwares#update 
        DELETE /hardwares/:id(.:format)     hardwares#destroy 

回答

1

你需要

def do_transfer 
    @hardware = Hardware.find(params[:id]) 
    ... 
end 

我還要藉此機會指出的是,你很可能在這個框架更多REST -ful的方式

+0

確定...當我再補充一點行它表明這個錯誤 引發ArgumentError在HardwaresController#do_transfer 太少論據 – 2012-02-01 07:06:55

+0

謝謝我發現了這個問題... – 2012-02-01 07:54:25

-1

錯誤是NoMethodError in HardwaresTransfersController#do_transfer
未定義的方法update_attributes'爲零:NilClass。

正如錯誤所述,Rails正試圖在nil:NilClass上調用update_attributes,這意味着您的@hardware對象爲零。
所以,你應該

@hardware = Hardware.find(params[:id]) 

你應該總是看的錯誤,並給它一個念頭,爲什麼這個錯誤是沒有初始化它,它會幫助你學習更好。

+0

好的...我解決了,但即時通訊太少參數錯誤 – 2012-02-01 07:25:41

0

發現硬件項目:

def do_transfer 
    @hardware = Hardware.find(params[:id]) 
    ... 
end 

和變化route.rb:

match "hardwares_transfers/:id" => "hardwares_transfers#do_transfer" , :as => :do_transfer 
+0

不工作...得到HardwareSController#ArgumentError o_transfer =參數太少 – 2012-02-01 07:24:53

+0

謝謝我發現問題.. – 2012-02-01 07:54:54

相關問題