0

我正在开发一个 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

“包含”属性基于此处提供的解决方案

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 将显示所有 article_categories 复选框,但会检查所有先前设置的文章类别,以便更新将删除未选中的复选框并将新选中的复选框添加到连接表中

对于 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 
4

1 回答 1

0

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

Formtastic,在为表单对象渲染显示表单时,通过调用表单对象上提供的方法

f.input :method_to_be_called, :as => :checkboxes

哪个 formtastic 会将其结果与通过

:collection => any_valid_ruby_object

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

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

这允许 formtastic 做正确的事情,至少在这种情况下是这样。此解决方案使 user_article_categories(连接表)上的“包含”属性变得多余!

于 2012-08-26T21:44:13.683 回答