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

StackOverflow https://stackoverflow.com/questions/1794383

Вопрос

Я использую драгоценный камень 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, если я все равно ограничиваю его current_user.events?И почему current_user.to_param нужно вызывать явно?Могу ли я переопределить это?

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top