1

私はRoRを初めて使用します。最初は sqlite3 データベースを使用していましたが、mysql に移行しました。データベースにレコードを追加するまで、アプリケーションはすべて正常に機能していました。

「irb」コンソールを使用して新しいレコードを更新できます。コントローラーに、レコードを更新する python スクリプトから呼び出される関数があります。

関数は次のとおりです。

# GET /dd_bots/update
# param name, att
def update
   obj = Object.all
   obj = obj.select{ |o| o.name == params[:name] }
   obj[0].update_attribute(:att, params[:att])
head :ok
end 

ただし、この関数は、このエラーを返す新しく追加されたレコードを更新しません。NoMethodError (undefined method update_attribute' for nil:NilClass)

明らかにレコードが見つからないようです...

なぜこれが起こっているのか手がかりはありますか?

4

2 に答える 2

4

まず、モデルを呼び出さないでください。これは、Ruby のほぼすべてのオブジェクトの基本クラスとObject同様に、悲惨な結果をもたらす可能性があります。Object

次に、update_attributeは配列である の最初の要素に対して呼び出されobjます。配列に要素が含まれていない場合、つまり、コントローラーに渡される名前パラメーターと同じ名前のオブジェクトがない場合、このエラーが発生します。

エラーが発生しにくい方法でこれを行うことができます。

def update
  obj = Object.find_by_name(params[:name])
  obj.update_attribute(:att, params[:att]) if obj
  head :ok
end

レコードが存在する必要がある場合、存在しない場合は例外をスローすることができます。!これを行うには、find_by_nameメソッドに a を追加します。

obj = Object.find_by_name!(params[:name]) # Could throw an ActiveRecord::RecordNotFound

これには、レコードが存在しない場合に HTTP 404 ステータス コードが返されるという利点がありますが、それ以外の場合は同じように動作します。

于 2013-05-14T13:48:37.543 に答える
1

これが従来のやり方です。モデル名に置き換えてください。Object

def update
  obj = Object.find_by_name(params[:name]
  if obj
    obj.update_attribute(:att, params[:att])
  end
  head :ok
end

それはあなたのために働きますか?
そうでない場合は、これをerbで試してObject.find_by_name('whatever_name')、レコードが実際に存在するかどうかを確認してください。

于 2013-05-14T13:47:49.140 に答える