在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| -%>
答案 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并且它没有吗?