2

まず最初に

使用:

  • レール4
  • Oracle 拡張アダプタ rails4 ブランチ

既存のデータベースにマッピングされた多対多の関係があります。私のモデルは次のようになります。

class EventMap < ActiveRecord::Base
  self.table_name="TAKE_PART"
  self.primary_key="id"
  belongs_to :event, foreign_key: "lottery_event_id"  
  belongs_to :entrant, foreign_key: "address_id"  
end

class Event < ActiveRecord::Base
  self.table_name="THE_EVENT"
  self.primary_key="id"
  has_many :event_maps, :foreign_key => "lottery_event_id"
  has_many :entrants, :through => :event_maps
  accepts_nested_attributes_for :entrants, :reject_if => :all_blank
end

class Entrant < ActiveRecord::Base
  self.table_name="ADDRESSES"
  self.primary_key="id"
  self.set_date_columns :date_of_birth
  has_many :events, :through => :event_maps
  has_many :event_maps, :foreign_key  => "address_id"
end

投票ページの静的ページ コントローラー

...
def vote
  @event=Event.find_by(id: 4227)
  @entrants=@event.entrants
  @entrant=@event.entrants.build
end
...

投票ビュー:

<%= form_for(@event) do |f| %>

  <%= f.fields_for :entrant do |builder| %>
    <%= render "/entrants/fields", :f => builder %>
  <% end %>

<div class="actions">
  <%= f.submit %>
</div>  
<% end %>

エントラント/フィールド部分:

<% if @entrant.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@entrant.errors.count, "error") %> prohibited this entrant from being saved:</h2>    
      <ul>
      <% @entrant.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.hidden_field :id %>
  <div class="field">
    <%= f.label :lastname %><br>
    <%= f.text_field :lastname %>
  </div>
  <div class="field">
    <%= f.label :firstname %><br>
    <%= f.text_field :firstname %>
  </div>
  <div class="field">
    <%= f.label :street %><br>
    <%= f.text_field :street %>
  </div>
  <div class="field">
    <%= f.label :country_id %><br>
    <%= f.number_field :country_id %>
  </div>
  <div class="field">
    <%= f.label :city %><br>
    <%= f.text_field :city %>
  </div>
  <div class="field">
    <%= f.label :telephone %><br>
    <%= f.text_field :telephone %>
  </div>
  <div class="field">
    <%= f.label :email %><br>
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :date_of_birth %><br>
    <%= f.date_select :date_of_birth %>
  </div>
  <div class="field">
    <%= f.label :lang_id %><br>
    <%= f.text_field :lang_id %>
  </div>
  <div class="field">
    <%= f.label :added %><br>
    <%= f.date_select :added %>
  </div>
  <div class="field">
    <%= f.label :salut %><br>
    <%= f.text_field :salut %>
  </div>
  <div class="field">
    <%= f.label :zip %><br>
    <%= f.text_field :zip %>
  </div>
  <div class="field">
    <%= f.label :newsletter %><br>
    <%= f.check_box :newsletter %>
  </div>
  <div class="field">
    <%= f.label :company %><br>
    <%= f.text_field :company %>
  </div>

フォームがイベント コントローラーに送信されるようになりましたPATCH

class EventsController < ApplicationController
  before_action :set_event, only: [:show, :edit, :update, :destroy]
  ...
  # PATCH/PUT /events/1
  # --> HOW DO I SAVE THE SUBMITTED ENTRANT HERE??? <--
  def update
    respond_to do |format|      
      if @event.update(event_params)
        format.html { redirect_to @event, notice: 'Event was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end
...
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def event_params
      params.require(:event).permit(:id, :lottery_id, :events_dates_id, :event_date, :event_location, :tickets_for_winner, :prize, :tickets_internally,
        :entrants_attributes => [:id, :lastname, :firstname, :street, :country_id, :city, :telephone, :email, :date_of_birth, :lang_id, :added, :salut, :zip, :newsletter, :company])
    end
end

Entrantを に登録し、が常に存在するためEvent、中間モデルにのみデータを追加するにはどうすればよいですか?EventMapEvent

accepts_nested_attributes_forテーブル間で変更を伝播するためにモデルに含める必要がありますか (ドキュメントからこれが何をするのかよくわかりませんでした)? Entrantを更新するには、フォームから追加のパラメーターを送信する必要がありEventMapますか?

主な目標: 参加者が既存のイベントに登録できるフォームが欲しい!

4

2 に答える 2

1

私たちは何も見ていないので、あなたのフォームについて判断するのは難しいです;)

しかし、ネストされた属性を作成できるのは正しいです. ネストされた属性から, 設定する必要があります.accepts_nested_attributes_for :some_model, :some_other_model

ドキュメントがわかりにくい場合は、Railscasts を参照してください: http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part- 2

于 2013-11-02T11:59:57.600 に答える