0

:group_nameクライアント側で一意性を検証する必要がある属性 があります。しかし、最初に、文字列を属性にアタッチしてから検証する必要があります。理由は聞かないでください。必要です =)

私はフォームを持っています:

 <%= form_for Group.new, url: what_to_do_groups_path ,method: :get ,:validate => true do |f| %>
 <div class="field_label">
<%= f.label :group_name%>
</div>
<div class="field">
<%=f.text_field :group_name %>
</div>
<%= submit_tag "Submit",  :commit =>"submit" %>

<br class="clear" />
<br />
<%end%>

コントローラ:

attr_accessible  :group_name
validates :group_name,      :uniqueness => { :case_sensitive => false}

したがって、ユーザーは「RedBull」と入力します。の:group_name値は「RedBull」です。"RedBull_Marc" という別のグループがある場合、文字列 "_Marc" を添付して、データベースで (クライアント側で) のみ検証したいのですが、どうすればよいですか?

このようなことをしてもいいですか?

validates :group_name+"_Marc",      :uniqueness => { :case_sensitive => false}

そして、そのようなグループがすでにデータベースにあるかどうかを確認するために、複数の文字列を添付する必要がある場合。「RedBull_Marc」または「RedBull_Kate」がデータベースにあるかどうかを確認したいので、次のように正規表現で実行できます: /_(Marc|Katja)/ しかし、どこにビルドすればよいですか?

前もって感謝します。

編集:
クライアント側の検証が存在する必要があります。

4

1 に答える 1

1

フックを使用して、before_validation検証される前に属性を変更できます。連結を行う独自のカスタム検証を作成することもできますが、before_validationそれが意図されているため、使用するのがおそらく最善です。

モデル:

class User < ActiveRecord::Base
  attr_accessible :group_name

  validates :group_name, :uniqueness => { :case_sensitive => false}

  before_validation :add_to_group_name

  protected
  def add_to_group_name
    self.group_name = group_name + '_Marc' # Edit however you want to here
  end
end

複数の値についてデータベースをチェックする必要がある場合、一意性の検証だけではできないため、データベースを検索するカスタム検証を作成する必要があります。likeあなたのユースケースでは、クエリを使用できるようです:

# % is a wildcard character and matches anything
# So group_name + "%" will match anything starting with group_name
User.where("group_name like ?", group_name + "%") 

したがって、モデルにはカスタム検証があります。

class User < ActiveRecord::Base
  attr_accessible :group_name

  validate :check_group_name_uniqueness

  def check_group_name_uniqueness
    if User.where("group_name like ?", group_name + "%").count > 0
      errors.add(:group_name, "is already taken")
    end
  end
end
于 2013-06-25T12:50:54.113 に答える