0

RubyとRailsは初めてです。ハードウェア データベースの :owner 値を更新するフォームを実行しています。カスタム ビュー名 transfer.html.erb を使用する場合。私のフォームコードは以下に表示されます。

<%= 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

そして、私が得るエラーは、HardwaresTransfersController#do_transfer undefined method update_attributes' for nil:NilClass Aplication Traces app/controllers/hardwares_transfers_controller.rb:23:indo_transfer' の NoMethodError です

パラメータ

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

私のルート.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
4

3 に答える 3

1

あなたが必要

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

また、この機会に、おそらくこれをよりRESTフルな方法で組み立てることができることを指摘します。

于 2012-02-01T04:34:55.210 に答える
0

ハードウェアアイテムの検索:

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

route.rbを変更します。

match "hardwares_transfers/:id" => "hardwares_transfers#do_transfer" , :as => :do_transfer
于 2012-02-01T04:47:50.313 に答える
-1

エラーはNoMethodError in HardwaresTransfersController#do_transfer
、nil:NilClassの未定義のメソッドupdate_attributes'です。

エラーが示すように、Railsはnil:NilClassでupdate_attributesを呼び出そうとしています。これは、@hardwareオブジェクトがnilであることを意味します。
したがって、次のように初期化する必要があります

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

あなたは常にエラーを見て、なぜこのエラーがそこにあるのかについて考えるべきです、それはあなたがよりよく学ぶのを助けるでしょう。

于 2012-02-01T04:41:06.723 に答える