0

私の背景

PHP開発者です。15年になります。Rubyは私にとって新しいものです(私の新しい挑戦)!

現在の設定

ユーザーモデルでDeviseを使用しています。
Rails:3.2.1
デバイス:2.1.2

使用事例

ユーザーが(Deviseコントローラーを介して)登録するときに、Userレコードだけでなく、Fooレコードも自動的に作成したいと思います。Fooレコードの作成を処理するafter_createを作成しました。

Class User < ActiveRecord::Base

  after_create :make_foo

  def make_foo
    Foo.create(
      :name => name,
      :user_id => id
    )
  end

end

Class Foo < ActiveRecord::Base

    belongs_to :user

end

症状

Fooレコードが作成されていないときに(検証など)、Userレコードが作成されたままになるという問題がありました(私はそれを望んでいませんでした)。after_createに、ユーザー作成をロールバックするRaiseExceptionを追加しました。
ただし、例外がスローされるよりも、いくつかの優れたエラー処理が必要です。現在、その例外を含む500エラーページが表示されます。失敗の理由とともにフォームを再度表示できるようにしたいと思います。

Class User < ActiveRecord::Base

  after_create :make_foo

  def make_foo
    foo = Foo.create(
      :name => name,
      :user_id => id
    )
    if !foo.valid?
      raise Exception.new('Foo creation failed.')
    end
  end

end

助けを求める

助言がありますか?

4

3 に答える 3

0

例外を発生させる代わりに、フラッシュメッセージを設定して同じページにリダイレクトすることができます

  if !foo.valid?

このようなブロック

 flash[:error] = 'error msg'

を使用してリダイレクトします

 session[:return_to] = request.referer
 redirect_to session[:return_to]
于 2012-08-29T18:35:34.867 に答える
0

最終的に、Devise Resitrations Controllerをオーバーライドし、createメソッド内にbegin ... restcue...endを配置しました。

# routes.rb
devise_for :users, :controllers => { :registrations => "my_devise/registrations" }

# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController
  def create
    begin
      super
    rescue Exception
      self.resource.errors[:base] << "My error message here"
      clean_up_passwords resource
      respond_with resource
    end
  end
 end
于 2012-08-29T21:58:05.017 に答える
0

Rails3:Devise User has_oneの関係を調べて、より適切なモデリングで問題が簡単になるかどうかを確認することをお勧めします。

現在user.rbをモデル化している方法は、実際には、ユーザーがFooなしで存在する可能性があるため(ただし、ユーザーに属している必要があります)、他の保証なし:make_fooにコールバックとして呼び出すだけです。after_create

于 2012-08-29T21:59:01.783 に答える