friendly_id и конфликт ActiveScaffold - PullRequest
1 голос
/ 20 января 2011

У меня установлено friendly_id и ActiveScaffold для моего приложения Rails.

Поскольку не все мои модели имеют уникальные поля имени, я должен использовать Slugged Model , чтобы заставить его работать.friendly_id выполняет работу безупречно. У меня есть дружественные URL-адреса, и я могу загрузить объекты, используя дружественный идентификатор.

Но когда я хочу создать новый объект с ActiveScaffold, он говорит следующее сообщение об ошибке:

ActiveScaffold :: ReverseAssociationRequired (Слагаемые ассоциации: для поддержки: has_one и: has_many, где родительская запись является новой, а дочерняя запись (записи) проверяет наличие родителя, ActiveScaffold требуется обратная ассоциация (own_to).)

Конечно, я не могу создать ассоциацию belongs_to на этой стороне, потому что она создается модулем friendly_id, и в нее должна быть включена каждая модель, которая работает в ином режиме.

Модель выглядит так:

class FooBar < ActiveRecord::Base
  has_friendly_id :name, :use_slug => true, :approximate_ascii => true
end

По моему ApplicationController:

class Admin::FooBarsController < Admin::ApplicationController
  active_scaffold :foo_bar do |config|
    config.list.columns = [ :id, :name ])
    config.update.columns = [ :name ]
    config.create.columns = config.update.columns
  end
end

Есть ли способ заставить эту работу работать?

Версии: friendly_id3.2.0, ActiveScaffold последний в ветке rails-2.3 git.

ОБНОВЛЕНИЕ : похоже, что он не конфликтует в рабочем режиме.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

вызов

has_friendly_id :name, :cache_column => 'cached_slug', :use_slug => true

... создает has_many и имеет одну ассоциацию, указывающую на модель AR слизняка, которая не имеет какой-либо полиморфной принадлежности к правильно определенной ассоциации.

Так что в основномчто нужно сделать, чтобы решить эту ошибку, это определить обратные ассоциации в контроллере вашей родительской модели (той, у которой есть friendly_id)

  active_scaffold :products do |config|
    ...
    config.columns[:slug].association.reverse = :product
    config.columns[:slugs].association.reverse = :product
  end

, и она работает: -)

PS: я использую friendly_id в качестве гема и главную ветку ActiveScaffold VHO для рельсов 3

0 голосов
/ 20 января 2011

Раньше у меня была та же проблема, которую я решил, но я не помню своего решения. Посмотрите на мой код. Единственный важный способ - использовать friendly_id в качестве плагина и загрузить его наконец с помощью config.plugin в environemnt.rb

aviable_plugins = Dir.glob(RAILS_ROOT+"/vendor/plugins/*").collect {|i| i.split("/").last }
config.plugins  = aviable_plugins + [:friendly_id] #friendly_id must be last

Я НЕ УВЕРЕН, извините, но если вы попробуете, дайте мне знать.

извините за мой английский

...