рельсы ActiveAdmin вложенная форма has_one acceptpts_attributes_ для формы проблемы - PullRequest
24 голосов
/ 17 ноября 2011

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

Пример 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 %>

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

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

Ответы [ 3 ]

56 голосов
/ 07 января 2012

Я нашел лучшее решение для вас. Вы можете использовать опцию :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]
22 голосов
/ 09 октября 2013

В рельсах 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
1 голос
/ 28 декабря 2011

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

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

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

...