friendly_id和ActiveScaffold冲突

时间:2011-01-20 17:18:19

标签: ruby-on-rails activescaffold friendly-id

我为我的Rails应用程序安装了friendly_idActiveScaffold

因为并非我的所有模型都有唯一的名称字段,所以我必须使用Slugged Model才能使其正常工作。 friendly_id完美地完成了我的工作,我有友好的URL,我可以使用友好的id加载对象。

但是当我想用ActiveScaffold创建一个新对象时,它会显示以下错误消息:

  

ActiveScaffold :: ReverseAssociationRequired   (协会slu ::为了   支持:has_one和:has_many在哪里   父记录是新记录和孩子   记录证实存在   父,ActiveScaffold需要   反向关联(belongs_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_id 3.2.0,最新的rails-2.3 git分支中的ActiveScaffold。

更新:似乎在生产模式下不会发生冲突。

2 个答案:

答案 0 :(得分:2)

致电

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

...创建一个has_many,并且有一个关联指向一个slug AR模型,该模型没有任何多态属于正确定义的关联。

所以基本上你需要做的就是在父模型的控制器中定义反向关联(具有friendly_id的东西)

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

它有效: - )

PS:我使用friendly_id作为gem和ActiveScaffold VHO master branch for rails 3

答案 1 :(得分:0)

过去我有同样的问题,我已经解决了,但我不记得我的解决方案,看看我的代码唯一相关的黑客是使用friendly_id作为插件并最后用environemnt.rb中的config.plugin加载它

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

我不确定,抱歉,但如果你试着让我知道。

对不起我的英语