0

gem Respondersを使用していますが、 を使用してモデルで作成したエラーを表示できませんerros.add(:base, 'Error message')

私のコントローラーで、の前に、オブジェクトrespond_with @appをデバッグしました、エラーが返されました@app@app.errors.any?true

私の見解では、オブジェクトflash@appオブジェクトをチェックすると、エラーはありません

アプリ コントローラー

# app_controllers.rb
def destroy
  @app = current_company.apps.find(params[:id])
  @app.destroy
  respond_with @app
end

アプリのモデル

# app.rb

before_destroy :destroy_on_riak

# ...

def destroy_on_riak
  # SOME CODE HERE
rescue Exception => e
  errors.add(:base, I18n.t("models.app.could_not_destroy", :message => e.message))
  return false
end

アプリ ビュー

# apps.html.haml
-flash.each do |name, msg|
  %div{:class => "flash #{name}"}
    =content_tag :p, msg if msg.is_a?(String)

これ@app.destroy

"#<ActiveModel::Errors:0x00000004fa0510 @base=#<App id: 34, ...>, @messages={}>"

これは@app オブジェクトです。@app.destroy

"#<ActiveModel::Errors:0x00000004fa0510 @base=#<App id: 34, ...>, @messages={:base=>[\"Não foi possível excluir a aplicação: undefined method `get_or_new' for #<App:0x00000004f824c0>\"]}>"

@base=簡単にするために、内部にあるものを削除しました。

4

4 に答える 4

2

jefflunt は正しいです。呼び出す#valid?と、エラー配列がクリアされます

バリデーターは、後で使用するために自分でエラーを追加する場合ではなく、オブジェクトの有効性を100% 判断するように設計されています。

ActiveRecord は override#valid?実行しますが、引き続き呼び出しますsuper:

エラーを追加して永続化したい場合は、次のようなものをお勧めします。

def failures
  @failures ||= []
end

validate :copy_failures_to_errors

def copy_failures_to_errors
  @failures.each { |f| errors.add(*f) }
end

次に、次を変更しますrescue

def destroy_on_riak
  # SOME CODE HERE
rescue Exception => e
  failures.push([:base, I18n.t("models.app.could_not_destroy", :message => e.message)])
  return false
end

これは複雑に思えますし、人々が を使用または推奨するオンラインの例さえあることは知っていerrors.add(:base, ...)ますが、後でエラーを保存して取得するための安全な方法ではありません。


また、単なる推奨事項ですが、どうしても必要な場合を除きStandardError、救助することをお勧めします。Exceptionメモリ不足エラーやそのようなものはExceptions ですが、救済したいすべての通常のエラーは から継承する必要がありStandardErrorます。参考までに。

于 2015-01-03T21:52:18.803 に答える
1

私はあなたにいくつかのヒントを与えます:

ヒント1

フォームがオブジェクトを呼び出しvalid?ている可能性があり@appます。このメソッドは、インスタンスの配列をvalid?クリアします。errors

errors検証コンテキストの外で配列/構造体を使用するのは正しくありません。しかし、これはMHOです。

ヒント2

Responders gem (過去に使用したことはありません) によると、ロケールを正しく構成する必要があるだけです。例:

flash:
  actions:
    create:
      notice: "{resource_name} was successfully created"
    update:
      notice: "{resource_name} was successfully updated"
    destroy:
      notice: "{resource_name} was successfully destroyed"
      alert: "{resource_name} could not be destroyed"

そうですか?

于 2013-10-28T19:27:19.053 に答える
1

謎は、(a) 正しいメソッドを呼び出していない可能性があるか、(b).errorsハッシュに含まれていると思われるものが含まれていないことのいずれかのようです。

間違った方法ですか?

コントローラーで呼び出しています@app.destroyが、エラーを追加するメソッドが呼び出されますdestroy_on_riak

これを入力するつもりはありませんか?

# app_controllers.rb
def destroy
  @app = current_company.apps.find(params[:id])
  @app.destroy_on_riak    # <= The offending line?
  respond_with @app
end

またはbefore_destroy、あなたのコード サンプルから を呼び出すコールバックが欠落していますdestroy_on_riakか? 含まれているコードから、メソッドが呼び出される場所がどこにもないdestroy_on_riakので、これは単なる推測です。

.errorsハッシュの予期しない内容?

それが問題でない場合は、 when@app.errors.any?が を返しtrue、コードのその時点で の内容を@app.errorsログに出力して、何が問題なのかを確認できます。

于 2013-10-28T19:02:34.287 に答える