无法设置一个活动的管理资源表单,其中有许多:通过assoc

时间:2012-08-24 19:17:04

标签: ruby-on-rails-3

我正在使用rails(3.7.8)应用并使用主动管理员来管理ff模型的资源:

class AdminUser < ActiveRecord::Base
  has_many :user_article_categories, :include => :article_categories  
  has_many :article_categories, :through => :user_article_categories, 
:source => :admin_user  
  has_many :articles, :through => :user_article_categories, 
:source => :admin_user
  # ...
end


class UserArticleCategory < ActiveRecord::Base
  belongs_to :admin_user
  belongs_to :article_category
  attr_accessible :admin_user_id, :article_category_id, :included
  attr_accessor :included
  after_find :set_included

  private

  def set_included
    self.included = "1"
  end
  # ...
end

“包含”属性基于解决方案presented here

class ArticleCategory < ActiveRecord::Base
  has_many :user_article_categories, :include => :admin_users
  has_many :admin_users, :through => :user_article_categories, 
:source => :article_category
  has_many :articles, :through => :user_article_categories, 
:source => :article_category
  # ...    
end

但我似乎没有(正确地)设置admin_users的表单,这样创建一个新的admin_user会将所有article_categories显示为复选框列表

虽然持久化的admin_user for update会显示所有article_categories复选框,但会检查所有先前设置的文章类别,以便更新将删除未选中的复选框并将新选中的复选框添加到连接表的内容

for admin / admin_users.rb我创建了如下表单,这不起作用,虽然它渲染正确,任何帮助将不胜感激

form do |f|
  if f.object.persisted? and current_admin_user.id == f.object.id
    f.inputs "Admin Details" do
      f.input :email
      f.inputs :for => user_article_categories do |usr_art_catr|
        usr_art_catr.input :article_category_id, :hidden
        usr_art_catr.input :included
      end
    end
  else
    f.inputs "Admin Details" do
      f.input :email
      f.input :superuser, :label => "Super User Priveleges"
      f.input :article_categories, :as => :check_boxes, 
    :collection => ArticleCategory.select("id, name")
    end
  end
  f.buttons
end 

1 个答案:

答案 0 :(得分:0)

实际上,要显示所有article_categories的复选框列表,并检查更新时给定admin_user的所有已检查文章类别。

Formtastic,在渲染表单对象的show表单时,通过

调用表单对象上提供的方法
f.input :method_to_be_called, :as => :checkboxes

哪个formtastic会将其结果与通过提供的集合进行比较

:collection => any_valid_ruby_object

但两者都应该返回相同的种类;数组/数组或散列/散列,无论如何,通过对两个集合执行差异来确定应检查哪些复选框。

formtastic调用的方法可以是admin_user上的一个实例方法,用于查询连接表,确定应检查哪些复选框,并从相关的article_categories表构建一个数组,或者在没有时返回一个空数组。

这允许formtastic做正确的事,至少在这种情况下。此解决方案使user_article_categories(join-table)上的“included”属性变得多余!