未定义的方法`new_record?'为零:NilClass

时间:2012-09-21 21:35:23

标签: ruby-on-rails ruby-on-rails-3 paperclip

在rails 3.2中,我创建了一个后置控制器。每个帖子可以有不同数量的回形针附件。为此,我创建了一个资产模型,其中每个资产都有一个回形针附件。一个帖子有很多资产和资产属于邮政。

资产模型

class Asset < ActiveRecord::Base
    belongs_to :post
    has_attached_file :photo, :styles => { :thumb => "200x200>" }
end

发布模型

 class Post < ActiveRecord::Base
      attr_accessible :content, :title
      has_many :assets, :dependent => :destroy
      validates_associated :assets
      after_update :save_assets

 def new_asset_attributes=(asset_attributes) 
        asset_attributes.each do |attributes| 
            assets.build(attributes) 
        end 
    end
    def existing_asset_attributes=(asset_attributes) 
        assets.reject(&:new_record?).each do |asset| 
        attributes = asset_attributes[asset.id.to_s] 
        if attributes 
            asset.attributes = attributes 
            else 
                asset.delete(asset) 
            end 
        end 
    end

    def save_assets 
        assets.each do |asset| 
            asset.save(false) 
        end 
    end 
end

帖子助手

module PostsHelper
  def add_asset_link(name) 
    link_to_function name do |post| 
      post.insert_html :bottom, :assets, :partial => 'asset', :object => Asset.new 
    end 
  end
end

邮寄表格

<%= form_for @post, :html => { :multipart => true } do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
        <% @post.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
    <div id="assets">
        Attach a file or image<br />
        <%= render 'asset', :collection => @post.assets %> 
      </div> 
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

资产部分

<div class="asset"> 
    <% new_or_existing = asset.new_record? ? 'new' : 'existing' %>
    <% prefix = "post[#{new_or_existing}_asset_attributes][]" %>

    <% fields_for prefix, asset do |asset_form| -%> 
        <p> 
          Asset: <%= asset_form.file_field :photo %> 
          <%= link_to_function "remove", "$(this).up('.asset').remove()" %> 
        </p> 
  <% end -%> 
</div>

大部分代码都来自这里:https://gist.github.com/33011我知道这是一个rails2应用程序,无论如何我不明白这个错误意味着什么:

undefined method `new_record?' for nil:NilClass
Extracted source (around line #2):

1: <div class="asset"> 
2:     <% new_or_existing = asset.new_record? ? 'new' : 'existing' %>
3:     <% prefix = "post[#{new_or_existing}_asset_attributes][]" %>
4:     
5:     <% fields_for prefix, asset do |asset_form| -%> 

2 个答案:

答案 0 :(得分:1)

尝试更改此

 <div id="assets">
    Attach a file or image<br />
    <%= render 'asset', :collection => @post.assets %> 
  </div>

<div id="assets">
  Attach a file or image<br />
  <% @post.assests.each do |asset|%>
    <%= render 'asset', :asset => asset %> 
  <% end %>
</div>

可能的原因是你打电话

<%= render 'asset', :collection => @post.assets %> 

您正在将一个集合传递给呈现的部分,但您不能使用部分中名称集合传递的ur集合。您使用的变量 Assest 在该特定渲染部分的范围内不存在:)

答案 1 :(得分:0)

读取错误,您的<%= render 'asset', :collection => @post.assets %>行可能会调用空数组吗?在你的控制台中,你能找到@ post.assets并且它没有吗?