我正在尝试为我的Gallery模型编写一个ActiveAdmin表单,该表单与我的Image模型有HABTM关系。
请注意,这不是this question的重复,因为我已在我的图库模型中使用“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'
答案 0 :(得分:3)
<% if image.object.new_record? %>
答案 1 :(得分:1)
我认为如果您发布错误日志转储会有所帮助。什么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
是rails表单构建器#fields_for
方法的包装器,无论对象是否是新记录,它都会以不同的方式执行(我认为如果{{1}它将属性哈希中的id包含为隐藏值返回true)。
无论哪种方式,因为表单构建器正在尝试为nil对象创建表单。你在调用image.new_record?
之前尝试构建一个库图像是正确的,但我认为它需要比这更早。它应该在表单开始构建之前放置(在#inputs
之上)。
还有另外两种类似的解决方案。您应该在表单开始呈现之前在控制器中构建库。然后,当您启动#semantic_form_for
对象的表单时,它已经知道它已构建了一个图像。或者,我认为如果你指定
@gallery
希望其中任何一个都能正常工作,因为问题似乎是它没有访问刚构建的图像。