вложенная форма rails ActiveAdmin has_one accepts_attributes_for formtastic issue

Я использую ActiveAdmin и Rails 3.1 - у меня проблемы с пониманием того, является ли следующая ошибка ошибкой или есть какой-то способ сделать это правильно, чего я не понимаю. Я пытаюсь использовать вложенную модель с одним отношением, чтобы я мог создать страницу и заполнить ее метаданные за 1 шаг. -- (страница имеет_одну метаданные, принимает_вложенные_атрибуты_для мета_данных)

Пример 1) в этом примере, когда я нажимаю новую страницу, раздел метаданных есть, но полей ввода нет — также, если я редактирую запись, она отображается правильно, однако набор полей продублировано во втором разделе... и если я удалю оболочку f.inputs semantic_field_for (что имело бы смысл), то она полностью сломается и ничего не покажет в области метаданных...

form do |f|
  f.inputs "Page Information" do
    f.input :name
    f.input :uri
    f.input :view
    f.input :body, :as => :text
    f.input :active
  end

  f.inputs "Meta Data" do
    f.semantic_fields_for :meta_data do |meta_form|
      meta_form.inputs :title, :description, :keywords, :name => "Meta Information"
    end
  end  
end

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

2) Как я обхожу это, но это кажется хакерским

<%= semantic_form_for [:admin, @page] do |f| %>
  <% @page.build_meta_data %>
  <%= f.inputs :name => "Page Information" do  %>
    <%= f.input :name %>
    <%= f.input :uri %>
    <%= f.input :view %>
    <%= f.input :body, :as => :text %>
    <%= f.input :active %>
  <% end %>
  <%= f.semantic_fields_for :meta_data do |meta_form| %>
    <%= meta_form.inputs :title, :description, :keywords, :name => "Meta Information" %>
  <% end %>

  <%= f.buttons %>
<% end %>

Заранее спасибо за любую помощь или разъяснения.

(примечание для модераторов, я начал другую ветку по этому вопросу, но это было не так ясно, и у меня еще не было обходного решения, которое я делаю сейчас, поэтому, если один из вопросов должен быть удален, пожалуйста, удалите другой)


person thrice801    schedule 16.11.2011    source источник


Ответы (3)


Я нашел лучшее решение для вас. Вы можете использовать опцию :for в помощнике inputs.

f.inputs "Meta Data", for: [:meta_data, f.object.meta_data || MetaData.new] do |meta_form|
  meta_form.input :title
  meta_form.input :description
  meta_form.input :keywords
end

Я думаю, что это тоже может работать, но я не проверял

f.inputs :title, :desctiption, :keywords, 
  name: "Meta Data",
  for: [:meta_data, f.object.meta_data || MetaData.new]
person Pechkin    schedule 07.01.2012
comment
спасибо, именно то, что я искал и нигде не мог найти! - person thrice801; 10.01.2012
comment
Я хочу, чтобы это сработало для меня. Форма создается, но внутри <li> нет html для скрытого вложенного значения. Формастик 2.2.1 - person Trip; 02.08.2013
comment
Вот что я сделал: = f.inputs "Registered Course", :for => [:registered_courses, f.object.new_record? ? RegisteredCourse.new : f.object.registered_courses] do |registered_course_form| = registered_course_form.input :enterprise_registration_id, input_html: { value: registration.id }, as: :hidden Мне нужно было использовать new_record? потому что это HABTM, поэтому пустой массив по-прежнему является значением. - person Trip; 02.08.2013

В rails 4 это то, что работает, с приятным дизайном.

например, у клиента есть одна учетная запись

модель/customer.rb

accepts_nested_attributes_for :account

admin/customer.rb

form do |f|
  f.inputs do
    f.input :user, input_html: { disabled: true }
      f.input :name
      f.input :address
      f.input :city
      f.input :country, as: :string
    end
    f.buttons

    f.inputs "Account Information", for: [:account, f.object.account] do |s|
      s.input :active, as: :boolean
      s.input :subscription, as: :boolean
      s.input :expires_on, as: :datepicker

      s.actions
    end
  end

  controller do
    def permitted_params
      params.permit!
    end
  end
end
person vladCovaliov    schedule 09.10.2013
comment
Это прекрасно работает, но вместо разрешения всех атрибутов путем переопределения метода контроллера вы можете сделать что-то вроде этого: allow_params :user, :name, account_attributes: [:active, :subscription, ...]. Это сработало для меня! - person Alex Kovshovik; 17.03.2014
comment
Не забудьте также разрешить параметр :id, иначе вы не сможете обновиться (вместо этого вы создадите новую запись). См. Настройка Strong Параметры - person akira; 16.01.2015

у меня была такая же проблема, я работал в вашем хаке и у меня все заработало. Затем я переместил <% @page.build_meta_data %> в новый пользовательский метод, подобный этому

  controller do
    def new
      @tenant = Tenant.new
      @tenant.build_tenant_configurable
    end
  end

надеюсь это поможет

person ben.m    schedule 28.12.2011