1

これに関する多くの投稿を読みましたが、まだ混乱しています。私はRailsに比較的慣れていません。Rails 3.2.8 と Ruby 1.9.3 を使用しています。

2 つの異なるテーブルのレコードを作成するフォームがあります。これは多対多の関係です (ログブックには複数の航空機を含めることができ、航空機は複数のログブックに表示されます)。

これが私のコードです:

# ----- Models ----- #
class Logbook < ActiveRecord::Base
  has_and_belongs_to_many :aircrafts
  accepts_nested_attributes_for :aircrafts
end

class Aircraft < ActiveRecord::Base
  belongs_to :logbook
end

# ----- Logbooks Controller ----- #
def my_method
  @logbook = Logbook.new 
  @aircraft = Aircraft.new
end

# ----- View ----- #
<%= form_for @logbook, validate: true, remote: true do |f| %>
  <%= f.label :flight_date, "Flight Date" %>
  <%= f.text_field :flight_date %>  
  ...

  <%= f.fields_for :aircrafts, validate: true, remote: true do |a| %>
    <%= a.label :aircraft_id, "Aircraft ID" %>
    <%= a.text_field :aircraft_id %>
    ...
  <% end %>
<% end %>

ログブック フィールドは正常にレンダリングされますが、航空機フィールドはレンダリングされません

何か案は?

4

2 に答える 2

2

コントローラーを次のように変更してみてください。

def my_method
  @logbook = Logbook.new 
  @aircraft = @logbook.aircrafts.build
end

@aircraftLogbookが必要なためbelongs_to、nested_form はフォームの作成方法を認識します。

注:@aircraft宣言する必要のない変数を使用しない場合は@logbook.aircrafts.build、コントローラーで使用するだけです

于 2012-12-11T18:56:19.413 に答える
0

私が正しく思い出すと、fields_for は親のために存在する多数のオブジェクトの数に基づいて生成されます。@logbook には航空機がないため、フィールドは表示されません。アクションを変更してみてください。

def my_method
  @logbook = Logbook.new
  @logbook.aircrafts << Aircraft.new
end

ここで、複数のログブックを追加するために UI で何かを作成する必要がある場合は、追加ボタンを作成する必要があります。以下に基づいて、作成する航空機レコードの量を増やすことができます。

<%= form_tag new_logbook_path, :method => :get do %>
  <%= hidden_field_tag "amount", @amount %>
  <%= submit_tag "Add" %>
<% end %>

次に、アクションは次のようになります。

def my_method
  @amount = params[:amount] || 1
  @logbook = Logbook.new
  @amount.times { @logbook.aircrafts << Aircraft.new }
end
于 2012-12-11T18:55:00.523 に答える