Почему вы должны явно указывать область видимости с помощью friendly_id?

Я использую гем friendly_id. У меня также есть вложенные маршруты:

# config/routes.rb
map.resources :users do |user|
  user.resources :events
end

Итак, у меня есть такие URL-адреса, как /users/nfm/events/birthday-2009.

В моих моделях я хочу, чтобы заголовок события был связан с именем пользователя, чтобы и nfm, и mrmagoo могли иметь события birthday-2009 без их задержки.

# app/models/event.rb
def Event < ActiveRecord::Base
  has_friendly_id :title, :use_slug => true, :scope => :user
  belongs_to :user

  ...
end

Я также использую has_friendly_id :username в своей модели пользователя.

Однако в моем контроллере я вывожу события, относящиеся только к вошедшему в систему пользователю (current_user):

def EventsController < ApplicationController
  def show
    @event = current_user.events.find(params[:id])
  end

  ...
end

Это не работает; Я получаю ошибку ActiveRecord::RecordNotFound; expected scope but got none.

# This works
@event = current_user.events.find(params[:id], :scope => 'nfm')

# This doesn't work, even though User has_friendly_id, so current_user.to_param _should_ return "nfm"
@event = current_user.events.find(params[:id], :scope => current_user)

# But this does work!
@event = current_user.events.find(params[:id], :scope => current_user.to_param)

ТАК, зачем мне явно указывать :scope, если я все равно ограничиваю его текущим_user.events? И почему current_user.to_param нужно вызывать явно? Могу ли я переопределить это?


person nfm    schedule 25.11.2009    source источник


Ответы (1)


У меня была точно такая же проблема с friendly_id 2.2.7, но когда я обновился до friendly_id 3.0.4 в своем приложении Rails 2.3.5, все заработало. Я проверил все 4 вызова поиска, которые вы упомянули в моем приложении, и они работают.

Обратите внимание на несколько изменений API, которые могут повлиять на вас. Те, с которыми я столкнулся, были:

  • :strip_diacritics был заменен на :strip_non_ascii.

    Вместо этого я решил переключиться на String#to_url Stringex, переопределив normalize_friendly_id

  • resource.has_better_id? сейчас !resource.friendly_id_status.best?

  • resource.found_using_numeric_id? сейчас resource.friendly_id_status.numeric?

person Jason Weathered    schedule 09.05.2010