Ошибка формы ActiveAdmin: "неопределенный метод` new_record? '" - PullRequest
1 голос
/ 14 октября 2011

Я пытаюсь написать форму ActiveAdmin для моей модели галереи, которая имеет отношение HABTM с моей моделью изображения.

Обратите внимание, что это не дубликат этого вопроса , так как я уже использую "accepts_nested_attributes_for" в моей модели галереи.

Вот форма моей галереи, которая выдает ошибку:

<% @gallery.images.build %>
<%= semantic_form_for [:admin, @gallery] do |g| %>
  <%= g.inputs "Details" do %>
    <%= g.input :title %>
    <%= g.input :images, :as => :check_boxes, :label_method => Proc.new { |image| image_tag(image.thumb_path, :alt => "") + content_tag("h3", image.title)  } %>
  <% end %>
  <%= g.inputs :for => :images, :name => "New Image" do |image| %>
    <% if image.new_record? %>
      <%= image.input :title %>
      <%= image.input :asset, :as => :file %>
    <% end %>
  <% end %>
  <%= g.buttons %>
<% end %>

Вот моя модель галереи:

class Gallery < ActiveRecord::Base
    belongs_to :admin_user
    has_and_belongs_to_many :images
    accepts_nested_attributes_for :images
end

Вот моя модель изображения:

class Image < ActiveRecord::Base
   belongs_to :admin_user   
   has_and_belongs_to_many :galleries

   has_attached_file :asset, :styles => {  
                                      :thumb => "96x96#"
                                      }

   validates_attachment_presence :asset
end

Вот журнал ошибок:

NoMethodError in Admin/galleries#edit

Showing /home/***/www/***/app/views/admin/galleries/_form.html.erb where line #8 raised:

undefined method `new_record?' for #<Formtastic::SemanticFormBuilder:0x164b2088>

Extracted source (around line #8):

5:       <%= g.input :images, :as => :check_boxes, :label_method => Proc.new { |image| image_tag(image.thumb_path, :alt => "") + content_tag("h3", image.title)  } %>
6:     <% end %>
7:     <%= g.inputs :for => :images, :name => "New Image" do |image| %>
8:       <% if image.new_record? %>
9:         <%= image.input :title %>
10:         <%= image.input :asset, :as => :file %>
11:       <% end %>

Trace of template inclusion: /home/bdastous/.rvm/gems/ruby-1.9.2-p290@rails31/gems/activeadmin-0.3.1/app/views/active_admin/resource/edit.html.arb

Rails.root: /home/bdastous/www/hotel_app_cms
Application Trace | Framework Trace | Full Trace

app/views/admin/galleries/_form.html.erb:8:in `block (2 levels) in _app_views_admin_galleries__form_html_erb__372176781_187575760'
app/views/admin/galleries/_form.html.erb:7:in `block in _app_views_admin_galleries__form_html_erb__372176781_187575760'
app/views/admin/galleries/_form.html.erb:2:in `_app_views_admin_galleries__form_html_erb__372176781_187575760'

Ответы [ 2 ]

3 голосов
/ 15 октября 2011
<% if image.object.new_record? %>
1 голос
/ 15 октября 2011

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

Я думаю, что проблема связана со следующими строками:

<% @gallery.images.build %>
<%= g.inputs :for => :images, :name => "New Image" do |image| %>
  <% if image.new_record? %>

Я вижу два сценария:

1) <% if image.new_record? %>выдает ошибку, потому что изображение ноль.
2) <%= g.inputs :for => :images, :name => "New Image" do |image| %> выдает ошибку.#inputs - это оболочка для конструктора форм рельсов. #fields_for Метод, который выполняется по-разному, независимо от того, является ли объект новой записью или нет (я думаю, что он включает идентификатор в хэш атрибутов в качестве скрытого значения, если image.new_record? возвращает true).

В любом случае, это потому, что построитель форм пытается создать форму для нулевого объекта.Вы правильно сделали, пытаясь создать изображение галереи до того, как был вызван #inputs, но я думаю, что это должно быть еще раньше.Вероятно, он должен быть размещен до того, как форма даже начнет строиться (выше #semantic_form_for).

Есть два других похожих решения.Вы, вероятно, должны построить галерею в контроллере до того, как форма начнет отображаться.Затем, когда вы запускаете форму для объекта @gallery, он уже знает, что у него есть встроенное изображение.В качестве альтернативы, я думаю, что это может сработать, если вы укажете

<%= g.inputs :for => @gallery.images, :name => "New Image" do |image| %>

Надеюсь, любой из них сработает, потому что, похоже, проблема в том, что он не обращается к только что созданному образу.

...