Rails ActiveAdmin вложенная форма has_one accepts_attributes_for formtastic issue
Я использую ActiveAdmin и Rails 3.1, имея проблемы с пониманием того, является ли следующее ошибкой, или если есть способ сделать это правильно, что я не понимаю. Я пытаюсь использовать вложенную модель с одним отношением, так что я могу создать страницу и заполнить ее метаданные за один шаг. -
(страница has_one meta_data, accepts_nested_attributes_for meta_data)
Пример 1)
в этом примере, когда я нажимаю новую страницу, раздел метаданных есть, но нет полей ввода - также, если я редактирую запись, она отображается правильно, однако набор полей дублируется во втором разделе... и если Я удаляю f.inputs wrapping 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) Как я работаю над этим, но кажется hacky
<%= 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 %>
Заранее благодарим за любую помощь или разъяснение.
(обратите внимание на модераторы, я начал еще один поток по этому вопросу, но не был таким ясным и не имел обходного решения, которое я делаю сейчас, поэтому, если один из вопросов нужно удалить, удалите другой)
Ответы
Ответ 1
Я нашел лучшее решение для вас. Вы можете использовать опцию :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]
Ответ 2
В рельсах 4 это то, что работает, с приятным дизайном
например.,
модель /customer.rb
accepts_nested_attributes_for :account
админ /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
Ответ 3
У меня была такая же проблема, я работал в вашем хаке и заработал.
i затем переместил <% @page.build_meta_data %>
в новый новый метод, подобный этому
controller do
def new
@tenant = Tenant.new
@tenant.build_tenant_configurable
end
end
надеюсь, что это поможет