4

次のような URL エンコードされたリソースがあります。

http://myurl/users/Joe%20Bloggs/index.xml

これは、パスでユーザー ログインを使用する RESTful Web サービス用です。問題は、レールのコントローラーが %20 をデコードしていないように見えることです。次のエラーが表示されます。

ActionController::RoutingError (No route matches "/Joe%20Bloggs/index.xml" with {:method=>:post}):

私が実際にやろうとしているのは、2 つのオプションのいずれかを達成することです (authlogic を登録ハンドラーとして使用):

  • (できれば)ユーザーがスペースを含むユーザー名を登録できるようにし、これらがコントローラーに正しくルーティングされるようにします。デフォルトでは、Authlogic はスペースと @/ を許可します。キャラクター - 私がそれを機能させることができれば、私には問題ありません...

  • または、スペースを許可しないように authlogic を制限できます。私はこれを行うことができることを知っています:

    .merge_validates_format_of_login_field_options...

しかし、新しい正規表現を提供し、失敗時にメッセージを返すための正しい構文が完全にはわかりません...

どんな提案でも大歓迎です!

4

1 に答える 1

1

一般に、このような状況では、モデルに URL セーフな「スラッグ」フィールドを用意することをお勧めします。例えば:

class User < ActiveRecord::Base
  before_validation :assign_slug

  def to_param
    # Can't use alias_method on methods not already defined,
    # ActiveRecord creates accessors after DB is connected.
    self.slug
  end

  def unique_slug?
    return false if (self.slug.blank?)

    if (new_record?)
      return self.class.count(:conditions => [ 'slug=?', self.slug ]) == 0
    else
      return self.class.count(:conditions => [ 'slug=? AND id!=?', self.slug, self.id ]) == 0
    end
  end

  def assign_slug
    return if (slug.present?)

    base_slug = self.name.gsub(/\s+/, '-').gsub(/[^\w\-]/, '')
    self.slug = base_slug
    count = 1

    # Hunt for a unique slug starting with slug1 .. slugNNN

    while (!unique_slug?)
      self.slug = base_slug + count.to_s
      count += 1
    end
  end
end

これにより、URL に適していない名前を持つという問題が解決される場合があります。Rails は、to_param の出力にドットがあるとなると、特に厄介です。

于 2010-02-01T20:10:40.313 に答える