Дублированная запись при неудачной проверке из формы с вложенными атрибутами - PullRequest
1 голос
/ 06 марта 2012

Так что я вижу очень странную функциональность в моем приложении. У меня довольно сложная форма с вложенными атрибутами. В основном, после неудачной проверки, я возвращаюсь в форму, и ошибочная запись была продублирована. Может показаться, что модель инициализирует запись после неудачной проверки.

ПРИМЕЧАНИЕ : я использую formtastic для создания формы, но я исключил ее как виновника.

Моя модель довольно сложная, но важны следующие детали:

...
accepts_nested_attributes_for :users
...
after_initialize :build_structure
...
private

def build_structure
   # builds the first user when the firm is initialized
   if users.length < 1
       logger.debug "First User!!!"
       user = users.new
       contact = user.contact = Contact.new
       contact.email_addresses.new
   end
end

Основной контроллер:

def new
  @firm = Firm.new
  render "new", layout: "blankslate" # new.html.erb
end

def create
    @firm = Firm.new(params[:firm])

    respond_to do |format|
        if @firm.save
            format.html { redirect_to root_url(subdomain: @firm.url)}
        else
            format.html { render action: "new", layout: "blankslate" }
        end
    end
end

А вид:

.container
  .row
    .span4.offset4.well
      .page-header
        %h1 Create Your Firm
      = semantic_form_for @firm, url: signup_path do |f|
        = f.input :name
        = f.input :url
        .page-header
          %h1 Create Your User
        = f.fields_for :users do |u|
          = u.fields_for :contact do |c|
            = c.input :first_name
            = c.input :last_name
            = c.fields_for :email_addresses do |cf|
              = cf.input :value, label: "Email Address"
          = u.input :password
          = u.input :password_confirmation


        = f.submit "Signup", class: "btn btn-primary"

Ответы [ 3 ]

0 голосов
/ 07 марта 2012

В качестве временного исправления я добавил следующее к своему контроллеру, пока кто-нибудь не предложит мне лучшее предложение.

if @firm.users.length < 1
  @first_user = @firm.users.first
  @firm.users = nil
  @firm.users < @first_user
end
0 голосов
/ 07 марта 2012

Причина, по которой это происходит, заключается в том, что у вас есть User.new как в вашей модели, так и в «новом» действии вашего контроллера, я выполняю инициализацию в одном месте. Я делаю это в «новом» действии.

0 голосов
/ 06 марта 2012

Я считаю, что ваша проблема заключается в использовании обратного вызова after_initialize.Это будет вызываться после каждого экземпляра нового объекта ActiveRecord.Это вводит в заблуждение и доставило мне неприятности раньше.

...