5

私は、has_manyTodoListsを持つプロジェクトのネストされたフォームにRails3、simple_form、およびcocoonを使用しています。simple_fields_for呼び出しに、ソフト削除されていないTodoListのみを含めたいので、名前付きスコープ「nondeleted」を使用したいと思います。

私のプロジェクトフォームには次のものがあります。

<%= f.simple_fields_for :todo_lists, f.object.todo_lists.nondeleted do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>

これは、編集ビューの最初のロードでは正常に機能します(つまり、削除されたTodoListは表示されません)が、検証に失敗したフォームを送信すると、新しく追加されたTodoListはすべて失われます。

名前付きスコープを削除すると、検証に失敗しても新しく追加されたTodoListは失われませんが、すべてのTodoList(削除されたものを含む)が表示されます。

私も次のことを試しました:

<% @project.todo_lists.each do |todo_list| %>
    <% if !todo_list.deleted && !todo_list.name.blank? %>
     <%= f.simple_fields_for :todo_lists, todo_list do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
    <% end %>
<% end %>

これは両方の問題を解決しますが、TodoListを適切な順序に保つ機能など、必要な柔軟性が得られません。

コレクションをsimple_fields_for(私が理解している限り、Railsのfields_forと同じ関連動作)に渡す方法はありますか?これにより、失敗した検証で新しく追加されたフィールドを削除せずに、名前付きスコープと並べ替えを使用できますか?

4

2 に答える 2

0

プロジェクトモデルのhas_many:todo_listsアソシエーションを次のように変更することで、問題を解決できました。

has_many :todo_lists, :conditions => { :deleted => false }, :order => :name

そして、ビューではそれは単純です:

<%= f.simple_fields_for :todo_lists do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
于 2012-11-25T22:38:25.790 に答える
0

デフォルトのスコープでも問題を解決できます

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  default_scope { where(active: true) }
end

<%= f.simple_fields_for :bars ... %>
于 2014-08-21T13:27:30.267 に答える