无法使用hasmany:through-assoc.设置活动的管理资源表单



我正在开发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_user设置一个表单,这样创建一个新的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 

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

Formtastic在为窗体对象呈现显示窗体时,通过调用窗体对象上提供的方法

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

哪个formtastic将其结果与通过

:collection => any_valid_ruby_object

但两者都应该返回相同的种类;array/array或hash/hash,通过对两个集合执行差异来确定应该检查哪些复选框。

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

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

最新更新