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

ただし、どちらも同じ種類を返す必要があります。配列/配列またはハッシュ/ハッシュなど、2つのコレクションで差分を実行することにより、どのチェックボックスをオンにするかを決定します。

formtasticによって呼び出されるメソッドは、結合テーブルをクエリして、チェックするチェックボックスを決定し、関連するarticle_categoriesテーブルからその配列を構築するか、存在しない場合は空の配列を返すadmin_userのインスタンスメソッドである可能性があります。

これにより、少なくともこのコンテキストでは、formtasticが正しいことを実行できます。このソリューションにより、user_article_categories(結合テーブル)の「included」属性が冗長になります。

于 2012-08-26T21:44:13.683 に答える