0

私はレールに非常に慣れていないので、これを行う最善の方法は何だろうと思っています:

データベースにレコードを作成するコントローラーがあります。

特定の検証エラーが発生した場合にフラグを設定したいのですが、慣れ親しんだ Rails パターンでこれを達成する良い方法がわかりません。

私が検出したいモデルの検証は次のとおりです。

validates_uniqueness_of :title

私のコントローラーはこれをやっています:

fcs = Entity.create(:title => text)

上記のエラーが失敗した場合、作業する ActiveModel エラー コレクションがあります。

タイトルが取得されたことをプログラムで示すフラグを確実に設定するにはどうすればよいですか?

これまで検討してきた

fcs.errors.messages.has_key?(:title)

ただし、タイトルが他の理由で失敗した場合、これは true を返します。したがって、次のようなものが必要になります。

fcs.errors.messages[:title]==["has already been taken"]

しかし、それはメンテナンスの頭痛の種であり、異なるロケールによっても壊れます...

RoRでこれを行う方法を知っている人はいますか?

アドバイスをありがとう

編集: 提案されたフラグ「is_title_duplicated」の使用例:

if(! fcs.errors.empty?)
      json['success']=false
      json['errors']=fcs.errors.full_messages
      json['title_was_duplicate'] = is_title_duplicated
      render :json => json

...
4

2 に答える 2

2

一意性を検出するために、モデルクラスにメソッドを追加することをお勧めします。

class Entity < ActiveRecord::Base
  def unique_title?
    Entity.where(:title => title).count > 0
  end
end

もちろん、これは、そのクエリを2回実行していることを意味します(1回はvalidates_uniqueness_ofと1回unique_title?)。パフォーマンスが許容範囲内である限り、パフォーマンスよりも読みやすさを優先します。パフォーマンスが許容できない場合でも、オプションがあります。独自のカスタム検証で再利用unique_title?して、結果をキャッシュできます。

class Entity < ActiveRecord::Base
  validate :title_must_be_unique

  def unique_title?
    # you may want to unset @unique_title when title changes
    if @unique_title.nil?
      @unique_title = Entity.where(:title => title).count > 0
    end
    @unique_title
  end

  private

  def title_must_be_unique
    unless unique_title?
      errors.add(:title, I18n.t("whatever-the-key-is-for-uniqueness-errors"))
    end
  end
end
于 2011-11-09T16:45:43.437 に答える
1

レコードにフラグを立てるということですか?検証が失敗するたびに、レコードはデータベースに保存されません

エラー メッセージを設定するだけの場合は、その必要はありません。Rails は自動的に fsc.erros を {:title => "title has already been taken"} のようなハッシュに設定します。:message をバリデーションに渡すことで、そのメッセージを指定できます。

また、l18n を使用してメッセージを国際化することもできます。ここで説明されているように yaml ファイルを編集するだけです: http://guides.rubyonrails.org/i18n.html#configure-the-i18n-module

于 2011-11-09T16:28:01.367 に答える