藝術家有許多事件。活動有許多藝術家。這兩個模型之間的連接稱爲表演。rails驗證嵌套屬性
當前「活動」表單創建「績效」,但爲添加到「活動」表單的每位藝術家創建一位新藝術家。
我想事件的形式:
- 驗證一個藝術家只能被添加到一個事件一旦
- 如果具有相同名稱的藝術家的藝術家表已經存在,創建協會在連接表(表演),但不創造另一個藝術家
- 如果具有相同名稱的藝術家已經不存在,創建和性能
我試過加將'validates_uniqueness_of:name'賦給artist.rb,但是這會阻止事件被保存。如果連接(表演)不存在,應該創建連接(表演),如果藝術家尚不存在,應創建藝術家,但藝術家的存在不應阻止創建連接/關聯。
event.rb
validates_presence_of :name, :location
has_many :performances, :dependent => :destroy
has_many :artists, :through => :performances
accepts_nested_attributes_for :artists, :reject_if => proc {|a| a['name'].blank?}, :allow_destroy => true
artist.rb
has_many :performances
has_many :events, :through => :performances
perfomance.rb
belongs_to :artist
belongs_to :event
events_controller.rb
def create
@event = Event.new(params[:event])
respond_to do |format|
if @event.save
flash[:notice] = 'Event was successfully created.'
format.html { redirect_to(admin_events_url) }
format.xml { render :xml => @event, :status => :created, :location => @event }
else
format.html { render :action => "new" }
format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
end
end
end
_form.html.erb
<% form_for([:admin,@event]) do |f| %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :location %><br/>
<%= f.text_field :location %>
</p>
<p>
<%= f.label :date %><br />
<%= f.date_select :date %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<% f.fields_for :artists do |builder| %>
<%= render 'artist_fields', :f => builder %>
<% end %>
<p><%= link_to_add_fields "Add Artist", f, :artists %></p>
<p>
<%= f.submit 'Submit' %> <%= link_to 'Cancel', admin_events_path %>
</p>
<% end %>
artist_fields.html.erb
<p class="fields">
<%= f.label :name, "Artist"%><br/>
<%= f.text_field :name %>
<%= link_to_remove_fields "remove", f %>
</p>
我一直在研究你提出什麼,但無法弄清楚如何開始。 – shalako 2010-07-05 17:48:55
所以我需要在事件模型中添加一個自定義方法,並以某種方式合併find_or_create_by_name。我需要移除accept_nested_attributes_for嗎?我需要使用虛擬屬性,就像Ryan Bates在Railscasts#102中所建議的那樣? Before_save,after_save?我還沒有找到一個很好的例子,說明這些東西如何融合在一起。 – shalako 2010-07-05 17:58:24
我添加了上面的artist_attributes =方法的示例。如果你想利用'f.fields_for:artist'的優勢,我認爲你仍然需要accepted_nested – 2010-07-13 23:41:03