1

イメージ モデルと HABTM 関係を持つギャラリー モデル用の ActiveAdmin フォームを作成しようとしています。

ギャラリーモデルですでに「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'
4

2 に答える 2

3
<% if image.object.new_record? %>
于 2011-10-14T20:34:50.737 に答える
1

エラーログのダンプを投稿していただけると助かると思います。new_record とは何か少しあいまいです。を指しています。

問題は次の行に関係していると思います。

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

私が見る2つのシナリオがあります:

1)<% if image.new_record? %>画像が nil であるため、エラーがスローされます。
2)<%= g.inputs :for => :images, :name => "New Image" do |image| %>エラーをスローしています。 #inputsオブジェクトが新しいレコードであるかどうかにかかわらず、異なる方法で実行される Rails フォーム ビルダー メソッドのラッパーです( true を返す#fields_for場合は、属性ハッシュに id が非表示の値として含まれていると思います)。image.new_record?

いずれにせよ、フォーム ビルダーが nil オブジェクトのフォームを作成しようとしているためです。が呼び出される前にギャラリー イメージを作成しようとしたことは正しいことでしたが#inputs、それよりも前に行う必要があると思います。おそらく、フォームの作成が開始される前 ( の上#semantic_form_for) に配置する必要があります。

他に 2 つの同様のソリューションがあります。フォームのレンダリングを開始する前に、コントローラーでギャラリーを構築する必要があります。次に、@galleryオブジェクトのフォームを開始すると、イメージが構築されていることが既に認識されます。または、指定すればうまくいくかもしれないと思います

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

ビルドしたばかりのイメージにアクセスしていないことが問題のように思われるため、これらのいずれかが機能することを願っています。

于 2011-10-14T20:18:46.563 に答える