1

Room部屋番号が一意であることを検証するモデルがあります。ただし、ユーザーが新しいインスタンスを作成しているときに、既存の部屋を作成しようとすると、標準のこの部屋はすでに存在するRoomというエラーメッセージを表示する代わりに、その部屋へのリンクを提供して、編集できるようにします。 。例:エラーメッセージに次のように伝えたい:部屋xはすでに存在します。その部屋を編集するには、ここをクリックしてください。ここで、[ここをクリック]テキストは、その部屋オブジェクトの編集パスへのリンクです。

Railsでこれまたは同様のことを行う方法はありますか?アドバイスをいただければ幸いです。

4

1 に答える 1

1

client_side_validations gem https://github.com/bcardarella/client_side_validationsを使用して、railscast#263 http://railscasts.com/episodes/263-に示すように、JavaScriptでruby検証を使用できます(jqueryを使用している場合)。クライアント側の検証

既存のroom_idを検索し、それへのリンクをエラーメッセージに渡して、ビューに返されるカスタムバリデーターを作成できます。次のようになります。

# lib/room_existence_validator.rb
class RoomExistenceValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    if existing_room = Room.find_by_id(value)
      # unfortunately url_for helper is not defined here so it's hard-wired
      room_link = "/rooms/#{existing_room.id}/edit"
      object.errors[attribute] << "#{link_to "Click here", room_link} to edit that room"
    end
  end
end

form_forヘルパー呼び出しに:validates=>trueの部分を追加する必要があります。今では、ajaxified呼び出しなしで動作します。

ajaxで動作させるには、さらに2つのことを行う必要があります。

a)rails.validations.custom.jsファイルを追加します。これは次のようになります。

# rails.validations.custom.js
# please beware the .remote in function-name
ClientSideValidations.validators.remote['existing_room'] = function(element, options) {
  if ($.ajax({
    url: '/validators/existing_room',
    data: { id: element.val() },
    // async *must* be false
    async: false
  }).status == 404) { return options.message; }
}

b)バリデーターに応答するラックミドルウェアを追加するなどして検証リクエストをルーティングします-client_side_validationswikihttps://github.com/bcardarella/client_side_validations/wiki/Custom-Validatorsで説明されているルート

それが役立つことを願っています:D

于 2012-06-24T03:25:12.513 に答える