0

has_many ArticleAssets という記事があります。かなり単純です。記事の編集フォームで、新しい記事のアセットを追加したいだけです。現在のものを編集する必要はないので、次のようなパーシャルを作成しました。

<% f.fields_for :article_assets, article_asset do |builder| -%>
    <div class="article_asset">
        <%= builder.file_field :image %>
        <%= builder.check_box :is_flagged, :class => "isFlagged" %> isFlagged
    </div>
<% end -%>

一度に必要なオブジェクトは 1 つだけで、既存の記事アセットからのデータは必要ないため、コレクションはありません。edit.erb の形式で、次をレンダリングします。

<%= render :partial => 'article_asset', :locals => {:f => f}, :object => ArticleAsset.new %>

これにより、情報を追加できる 1 つの新しい記事アセットが表示されます。これまでのところすべてクールです。重要なのは、このフィールドがarticle[article_assets_attributes][0][is_flaged]の名前形式を取得することです。これにより、レールのチェックボックスが常に付いている隠しフィールドも残りのフィールドにグループ化されるため、すべて問題ありません。次に、これを行う「アイテムの追加」リンクがあります。

page.insert_html :bottom, :article_assets_fields, :partial => "article_asset", :locals => {:f => f}, :object => ArticleAsset.new

このリンクをクリックすると、作成されたフィールドの下に、期待どおり、 article[article_assets_attributes][1][is_flaged]のチェックボックス フィールドの名前形式を持つ新しいフィールドが表示されます。インクリメント、完璧です!ただし、同じリンクを使用して別のフォームを追加すると、同じフォーム (識別子も 1、重複) が生成されるため、フォームの送信には 3 つではなく 2 つのアイテムしかありません。それを解決しますか?

ルビーオンレール 2.3.11

4

1 に答える 1

0

ネストされたフォーム 2.3 は失敗します。これは、レールキャストなどを見ていても、しばらくの間私の存在の悩みの種でした。これが私の方法です:

1) これは article.rb に入ります

    after_update :save_article_assets

    def new_article_asset_attributes=(article_asset_attributes)
      article_asset_attributes.each do |attributes|
        article_assets.build(attributes)
      end
    end

    def existing_article_asset_attributes=(article_asset_attributes)
      article_assets.reject(&:new_record?).each do |article_asset|
        attributes = article_asset_attributes[article_asset.id.to_s]
        if attributes
          article_asset.attributes = attributes
        else
          article_assets.delete(article_asset)
        end
      end
    end

    def save_article_assets
      article_assets.each do |article_asset|
        article_asset.save(false)
      end
    end

2) どこかのヘルパーで:

def add_article_asset_link(name)
  button_to_function name, :class => "new_green_btn" do |page|
        page.insert_html :bottom, :article_assets, :partial => "article_asset", :object => ArticleAsset.new()
    end
end

def fields_for_article_asset(article_asset, &block)
  prefix = article_asset.new_record? ? 'new' : 'existing'
  fields_for("article[#{prefix}_article_asset_attributes][]", article_asset, &block)
end

3)部分的に:

<% fields_for_article_asset(article_asset) do |aa| %>
    <tr class="article_asset">
      <td><%= aa.text_field :foo %></td>
        <td><%= link_to_function "remove", "$(this).up('.article_asset').remove()" %></td>
    </tr>
<% end %>

4) _form:

<table>
    <%= render :partial => "article_asset", :collection => @article.article_assets %>
</table>

<%= add_article_asset_link "Add asset" %>
于 2012-06-27T20:43:22.947 に答える