2011-01-27 17 views
8

İç içe geçmiş bir model formuna dinamik olarak alan ekleme http://railscasts.com/episodes/73-complex-forms-part-1 ve http://railscasts.com/episodes/74-complex-forms-part-2 izledim, ancak kodu denerken benim için işe yaramadı gibi görünüyor - benim varsayımım o zamandan beri raylar içinde çok değişti. İkinci konu JQuery kullanıyorum.Rails 3

Bunu yapmak için daha kolay bir yol gösterebilecek çevrimiçi eğitici bilen var mı? Zaten iç içe geçmiş bir model formu yaptım - bu yüzden gerçekten sadece ekleme/çıkarma alanları dinamik olarak beni öldürüyor.

+1

sen işe yaramadı nasıl bir açıklama sağlayabilir application.js? Kodu belirlemeye yönlendiren davranış neydi? –

+0

3.times {@ project.tasks.build} görünümümdeki kodla bile herhangi bir etki yaratmıyor gibi görünmüyor – Elliot

cevap

11

Tek bir sayfadan birden çok davetin nasıl gönderileceğini gösteren basit bir örnek. Bazı küçük detaylar eksik ama yardım etmek için yeterli olabilir. Bazı basit jQuery'leri kullanarak görünümden alan ekleyebilir ve kaldırabilirsiniz. Bu kod, herhangi bir iç içe geçmiş model durumuna adapte edilebilir. Umarım yardımcı olur! :)

InviteController.rb

class InviteController < ApplicationController 
    def new 
    @invites = Invite.new 
    end 

    def create 
    @invites = User.new(params[:user]).invites 
    if @user.update_attributes(params[:user]) 
     return redirect_to root_url, :notice => "Your invite(s) were successfully sent!" 
    else 
     render :action => :new 
    end 
    end 
end 

User.rb

class User < ActiveRecord::Base 
    has_many :invites 

    accepts_nested_attributes_for :invites 
end 

Invite.rb

class Invite < ActiveRecord::Base 
    belongs_to :user 
    after_create :send_invite 

    private 

    def send_invite 
    # Send e-mail... 
    end 
end 

new.html.erb

<% form_tag invites_path do %> 
    <%= error_messages_for :object => @user.invites %> 
    <ul id="invite-list"> 
    <%= render @invites %> 
    </ul> 
    <div> 
    <%= submit_tag "Send Invite" %> 
    <%= link_to "Add Another", "#add", :id => "add-another" %> 
    </div> 
<% end %> 

_invite.html.erb

<%= fields_for "user[invites_attributes][]", invite do |i| %> 
    <li> 
    <%= link_to("Remove", "#delete", :class => "delete-invite") %> 
    <%= i.label :full_name, "Full Name" %> 
    <%= i.text_field :full_name %> 
    <%= i.label :email, "Email Address" %> 
    <%= i.text_field :email %> 
    </li> 
<% end %> 

$(document).ready(function() { 
    $('a#add-another').click(function() { 
    $('#invite-list li:first').clone().find('input').val('') 
    .end().appendTo('#invite-list'); 
    }); 

    $('.delete-invite').live('click', function() { 
    if ($('#invite-list li').length > 1) 
    $(this).parent().remove(); 
    else 
    alert('You need at least one invite.') 
    }); 
}); 
+0

Henüz denemedim - ama bu doğru görünüyor! Teşekkürler! – Elliot

+0

Harika! :) Gönderdiğim kod ve Ryan Bate'in koduyla ilgili farklı olan tek şey, örneğimin yeni davet nesnelerini var olan bir kullanıcıya (nesneye) kaydetmesi. Örneğin yukarıdaki kodun, örneğin, iç içe yapılacak iş öğelerini içeren yeni bir yapılacaklar listesi nesnesi oluşturmak istiyorsanız, ayarlanması gerekir. Bunu yapmak için büyük bir değişiklik olmamalı. – CalebHC

+3

Alanları klonladığım sırada, hepsinin "snippet [samples_attributes] [0] [codes_attributes] [0] [comment]' olarak ayarlanan ad özniteliğine sahip olması durumunda ne yapmalıyım? eylem tüm alan kümelerini okur? –