Динамическое добавление полей в форме вложенной модели в Rails 3 - PullRequest
8 голосов
/ 27 января 2011

Я смотрел http://railscasts.com/episodes/73-complex-forms-part-1 и http://railscasts.com/episodes/74-complex-forms-part-2, но, похоже, у меня не получилось, когда я пробовал код - мое предположение, что с тех пор в рельсах многое изменилосьВторая проблема - я использую JQuery.

Кто-нибудь знает какие-либо учебные пособия в Интернете, которые могут показать более простой способ сделать это?Я уже сделал одну вложенную форму модели - так что на самом деле это просто динамическое добавление / удаление полей, что убивает меня.

1 Ответ

11 голосов
/ 27 января 2011

Вот простой пример, который показывает, как отправить несколько приглашений с одной страницы.Некоторые мелкие детали отсутствуют, но этого может быть достаточно, чтобы помочь.Вы можете добавлять и удалять поля из представления с помощью простого jQuery.Этот код может быть адаптирован к любому типу вложенной модели ситуации.Надеюсь, поможет!:)

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 %>

application.js

$(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.')
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...