3

私はここ数週間、Rails に取り組んでいましたが、答えが見つからない問題に遭遇しました。これはおそらく本当に単純なことだと思いますが、それは私を夢中にさせているので、少しのガイダンスを得ることを望んでいます...

1 つのフォームから 2 つのモデルにデータを挿入しています。1 つのモデルは Venue と呼ばれ、もう 1 つのモデルは Events と呼ばれます。これは、複数のイベントがベニューに属し、ベニューに多くのイベントがある 1 対多の関連付けです。

モデル:

class Venue < ActiveRecord::Base
  has_many :events
  accepts_nested_attributes_for :events
end

class Event < ActiveRecord::Base
  belongs_to :venue

  scope :upcoming, where('date >= ?', Date.today)
 end  

コントローラ:

class EventsController < ApplicationController

def new
      @venue = Venue.new
end

def create

@venue = Venue.new(params[:venue])

    if @venue.save
        render :inline => "Success"
    else
        render('new')
    end
end

end

形:

<%= form_for(@venue, :url =>{:action => 'create'}) do |f| %>

        Artist ID<br />
        <%= fields_for :event do |event_fields| %>
            <%= event_fields.text_field :artist_id %><br/><br />
        <% end %>

        Venue City<br />
        <%= f.text_field(:city) %> <br /><br />
        Venue Name<br />
        <%= f.text_field(:name) %><br/><br/>


        <div class="actions">
            <%= submit_tag "Save", :class => "btn primary" %>
        </div>

<% end %>

ログ出力:

Started POST "/events" for 127.0.0.1 at 2012-02-17 19:57:24 -0500
Processing by EventsController#create as HTML
Parameters: {"utf8"=>"✓",   "authenticity_token"=>"p3llx5KsYn6gyjP9g2qwzXr+0rjh3h/o34h/iqvqjRo=", "event"=>{"artist_id"=>"124"}, "venue"=>{"city"=>" Boston", "name"=>"Bostons Fa'v"}, "commit"=>"Save"}
(0.2ms)  BEGIN
SQL (0.8ms)  INSERT INTO "venues" ("address_1", "address_2", "capacity", "city", "country", "created_at", "created_by", "name", "state", "updated_at", "url", "zip") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id"  [["address_1", nil], ["address_2", nil], ["capacity", nil], ["city", " Boston"], ["country", nil], ["created_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["created_by", nil], ["name", "Bostons Fa'v"], ["state", nil], ["updated_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["url", nil], ["zip", nil]]
(0.4ms)  COMMIT
Rendered inline template (0.2ms)
Completed 200 OK in 5ms (Views: 0.6ms | ActiveRecord: 1.4ms)

ご覧のとおり、失敗していませんが、1 つのモデルにしか送信されていません。私の理解では、「accepts_nested_attributes_for :events」を追加することで、Venue モデルはイベント テーブルに移動し、提供したイベント データ (この例では artist_id のみ) を使用して新しいイベントを作成し、id フィールドを自動的に挿入することを認識しています。会場テーブルをvenue_idに。

ここでこれについて考えれば考えるほど、私は一歩を踏み外しているかもしれないと思う.

ありがとう

4

2 に答える 2

1

フォームに構文エラーがあると思います。fields_for は f のメソッドであり、複数のシンボルを想定しています。また、ブロックの反復子を単数形にし、メソッドが 1 つのパラメーターのみを想定している場合は括弧を使用しないこともお勧めします。

<%= form_for(@venue, :url =>{:action => 'create'}) do |f| %>

        Artist ID<br />
        <%= f.fields_for :events do |event_field| %>
            <%= event_field.text_field :artist_id %><br/><br />
        <% end %>

        Venue City<br />
        <%= f.text_field :city %> <br /><br />
        Venue Name<br />
        <%= f.text_field :name %><br/><br/>


        <div class="actions">
            <%= submit_tag "Save", :class => "btn primary" %>
        </div>

<% end %>

Ryan Bate の Railscasts のネストされたフォームの例を参照してください。

<%= form_for @survey do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <% f.fields_for :questions do |builder| %>
  <p>
    <%= builder.label :content, "Question" %><br />
    <%= builder.text_area :content, :rows => 3 %>
  </p>
  <% end %>
  <p><%= f.submit "Submit" %></p>
<% end %>
于 2012-02-18T13:46:46.423 に答える
0

Venueモデルは、属性を含め、どの属性が一括割り当て可能かを指定する必要がありEventます。

attr_accessible :event_attributes, :address_1, :address_2, :capacity # ...
于 2012-02-18T01:24:26.427 に答える