2012-02-01 3 views
0

Im новый для Ruby и rails. Im делает форму, которая обновляет: значение владельца в базе данных Hardware. в использовании пользовательских представлений имя transfer.html.erb. мой код формы отображается ниже.рельсы 3 неопределенный метод `update_attributes 'для nil: 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 слишком мало аргументы –

+0

спасибо, что я нашел проблему ... –

-1

Ошибка NoMethodError in HardwaresTransfersController#do_transfer
undefined method update_attributes 'для nil: NilClass.

Как говорится в ошибке, Rails пытается вызвать update_attributes на nil: NilClass, что означает, что ваш объект @hardware равен нулю.
Таким образом, вы должны инициализировать его

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

Вы всегда должны смотреть на ошибки и дать ему мысль, почему эта ошибка есть, это поможет вам в изучении лучше.

+0

ok ... я исправить это, но im получить слишком мало аргументов ошибка –

0

найти оборудование вещь:

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

и изменение route.rb:

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

не работает ... получение ArgumentError в HardwaresController # d o_transfer = слишком мало аргументов –

+0

спасибо, что я нашел проблему .. –

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