2

という名前のモデルがあり、10冊の本のフィールドを表示Bookするように標準を調整してBook#new、1冊ではなく10冊を一度に作成できるようにします。

この質問を見て、フォームに追加すればフォームを繰り返すことができることがわかりました10.times。しかし、新しいレコードが保存されているため、正しく実行しませんでしたが、すべてのフィールドがnullになっています。

私がしたいことは次のとおりです。

  1. ユーザーが一度に最大10冊の本を入力して保存できるようにする
  2. ユーザーが3つの本のレコードのみを入力する場合は、3つだけを作成します(null値を持つ他の形式の7つのレコードは無視します)

私の見解:

<%= simple_form_for(@book) do |f| %>
  <%= f.error_notification %>
  <% 10.times do |index|%>
    <%= f.input :title %>
    <%= f.association :book_category %>   
  <% end %>

  <%= f.submit %>
<% end %>

私のコントローラーはスキャフォールディングコードから変更されていません:

def new
  @book = Book.new
end

def create
  @book = Book.new(params[:book])
end
4

2 に答える 2

12

投稿の他の質問と同じ方法を使用できない理由は、bc@bookがユーザーのネストされた属性ではないためです。1冊の新しい本のフォームを作成しているだけなので、コントローラーに特別なものがなければ、railsは1冊の本しか保存しません。1つのオプションは、ブックをユーザーのネストされた属性にして、一度に複数のブックを作成できるようにすることです。ネストされた属性を処理するためにモデルとフォームを設定する方法は次のとおりです。

Class User < ActiveRecord::Base
  has_many :books
  accepts_nested_attributes_for :books, :reject_if => lambda { |b| b[:title].blank? }
  attr_accessible :books_attributes
end 

Class Book < ActiveRecord::Base
  belongs_to :user
end

reject_if、タイトルなしでコントローラーに送信されたレコードをすべて無視します。多くのユーザーが10個のフィールドすべてを使用するわけではないと想定しているため、これが必要になります。以下はあなたのフォームです。

<%= form_for @user do |f| %>
  <%= f.fields_for :books, [Book.new]*10 do |book| %>
    <%= book.text_field :title %>
    <%= book.association :book_category %>
  <% end %>
  <%= f.submit %>
<% end %>

このフォームはユーザーフォームであるため、ユーザーコントローラーに送信されることに注意してください。ブックはネストされた属性として受け入れられるようになったため、ユーザーコントローラーは、ユーザーの他の属性と同じようにすべてのブックの作成/更新を処理します。その他の例については、ネストされた属性でこのRailscastをチェックアウトしてください。

上で述べたように、これは1つのオプションにすぎません。本をユーザーのネストされた属性にしたくない場合、別のオプションは、すでに行っているように10セットの本入力フィールドを生成し、Booksコントローラーの作成アクションでparamsハッシュを分解することです。これを行うことで、ハッシュをループして、入力のセットごとに本を作成できます。これは使用するよりもはるかに「ハッキー」ですaccepts_nested_attributes_forが、別のオプションなので、言及したいと思いました。

于 2013-03-09T00:54:42.957 に答える
2

あなたが参照したサンプル記事は、ネストされたモデルフォームについて話していました。Railscastsにもビデオがあります: http: //railscasts.com/episodes/196-nested-model-form-part-1

どちらも、他のモデルとの関係を持つモデルの単一のインスタンスを参照します。

ネストされた関係ではなく、同じモデルの複数のインスタンスを実行します。

私の質問は、なぜですか?単一のレコードを送信するためにEnterキーを押すよりも、あるフィールドセットから別のフィールドセットへのタブ移動の時間を本当に節約できますか?

データ入力の時間を節約したい場合は、createアクションを新しいものにリダイレクトして、次のレコードをすぐに入力できるようにしないでください。または、AJAXを使用して、各レコードが送信された後にページに新しいフィールドセットを追加しますか?

これらのメソッドは、ビューとコントローラーを優れたRESTfulに保つと思います。

于 2013-03-08T22:53:05.683 に答える