1

私は次の3つのモデルを持っています:

class Site < AR::Base
  has_many :installed_templates, :as => :installed_templateable, :dependent => :destroy

  accepts_nested_attributes_for :installed_templates, :allow_destroy => true, :update_only => true, :reject_if => lambda { |t| t[:template_id].nil? }
 end

class Template < AR::Base
  has_many :installed_templates, :inverse_of => :template
end

class InstalledTemplate < AR::Base
  belongs_to :template, :inverse_of => :installed_template
  belongs_to :installed_templateable, :polymorphic => true
end

ビジネス ロジックでは、Templatesを作成すると複数存在し、 for eachSiteを作成することで必要な数だけ関連付けることができます。InstalledTemplateASiteは一意しか持つことができません。同じものを 2 回 1 つTemplatesの に関連付けることはできません。TemplateSite

のフォームに次のものがありますSite

<% Template.all.each_with_index do |template| %>
  <%= hidden_field_tag "site[installed_templates_attributes][][id]", Hash[@site.installed_templates.map { |i| [i.template_id, i.id] }][template.id] %>
  <%= check_box_tag "site[installed_templates_attributes][]]template_id]", template.id, (@site.installed_templates.map(&:template_id).include?(template.id) %>
  <%= label_tag "template_#{template.id}", template.name %>
<% end %>

上記は、多くの実験の後に機能するように見える唯一のものです。form_forおよびfields_forヘルパーを使用して、これをまったく達成できませんでした。

それはかなり単純な関係のように思えますが、何かが欠けているのではないかと心配しています. 上記をよりクリーンな方法で達成する方法について誰かアドバイスがありますか?

ありがとう

4

3 に答える 3

3

以下を試してください

<% form_for @site do |f| %>

  <%f.fields_for :installed_templates do |af|%>

    <%= af.text_field :name %>
  <%end%>
<%end%>
于 2013-07-19T11:34:18.457 に答える
1

ここで結合モデルは必要ですか?

class Site < ActiveRecord::Base
  has_and_belongs_to_many :templates
end

フォームでは、simple_form を使用すると最も簡単です。

<%= form.input :template_ids, :as => :radio_buttons, :collection => Template.order(:name), :label => 'Templates installed:' %>

結合モデルが必要な場合は、追加できるテンプレートのドロップダウンまたはリストがあり、それぞれにフォームを送信してそのテンプレートを追加するボタンがあります。次に、update_only ネストされた属性フォームを使用して、現在インストールされているテンプレートとその設定を表示します。

class Site < ActiveRecord::Base
  ...
  attr_accessor :install_template_id
  before_validation :check_for_newly_installed_template
  def check_for_newly_installed_template
    if install_template_id.present?
      template = Template.find install_template_id
      if template.present? and not templates.include?(template)
        self.templates << template
      end
    end
  end
end

これは、設定を編集したり、現在のテーマとして選択したりする前に、テーマを有効にする必要がある Drupal のようなものです。

于 2013-06-08T04:44:23.163 に答える