2

理想的には、次のような URL が必要です。

/users/ジョン-s

/users/foo-b

/users/brad-p

次のようなユーザーモデルがあります。

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, :use => :slugged

  validates :first_name, :presence => true
  validates :last_name, :presence => true

  # "John Smith" becomes "John S."
  def name
    "#{self.first_name.capitalize} #{self.last_name[0].capitalize}."
  end
end

悪い動作は、次のコンソール出力で最もよく説明されています。

[15] pry(main)> User.new(first_name: nil, last_name: nil).save!
   (0.2ms)  BEGIN
   (0.1ms)  ROLLBACK
NoMethodError: undefined method `capitalize' for nil:NilClass

問題(ついに!:))

私の検証の前に FriendlyId が呼び出されfirst_namelast_nameトリガーされるようです。これにより、namecapitalize が nil 値に対して呼び出されると、メソッドがうんざりします。

FriendlyId が呼び出される前に検証がトリガーされるようにするにはどうすればよいですか? そして、実際にはもう少し進めます...有効性が確立される前にFriendlyIdが関与するのはなぜですか?

ありがとうございました!!

4

3 に答える 3

2

保存時の検証の前にスラッグが生成されるため、呼び出されます。

https://github.com/FriendlyId/Friendly_id/issues/280

モンキーパッチを適用するのに何が必要かはよくわかりません。

于 2012-06-22T03:35:26.953 に答える
1

私が行く方法は、作成時に before_validation でユーザー名を設定することだと思います。これは、slug を設定する Friendly_id 独自の before_validation コールバックの前に追加されます。

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, :use => :slugged

  # Make sure to prepend it so that it runs before Friendly_id's own callback
  # http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
  before_validation :set_name, on: :create, prepend: true

  validates :first_name, :presence => true
  validates :last_name, :presence => true

  # To control when new slugs should be generated
  def should_generate_new_friendly_id?
    new_record? || first_name_changed? || last_name_changed?
  end

  private

  def set_name
    "#{self.first_name.capitalize} #{self.last_name[0].capitalize}."
  end
end

お役に立てれば!

于 2014-02-06T15:11:18.253 に答える
1

私が私のものを修正した方法は次のようなものでした:

  def name
    "#{self.first_name.capitalize} #{self.last_name[0].capitalize}." if first_name.present? && last_name[0].present?
  end
于 2013-09-06T14:12:52.700 に答える