2

我有一个错误“无法批量分配受保护的属性:上传”,但我已将其分配为可访问。

这是具有多态关联的嵌套形式。

楷模

class Upload < ActiveRecord::Base
  attr_accessible :link, :post_id
  belongs_to :uploadable, polymorphic: true
end

class Post < ActiveRecord::Base
  attr_accessible :description, :title, :uploads_attributes
  has_many :uploads, as: :uploadable
  accepts_nested_attributes_for :uploads, :reject_if => lambda { |a| a[:content].blank? 
  }, :allow_destroy => true
end

我也试过 put accept_nested ... for :uploadable 但告诉我不存在关联

控制器上的新动作是这个

def new
  @post = Post.new
  @post.uploads.new
end

这是创建的表格

<%= form_for [:admin,@post], remote: true, :html => {:multipart => true}  do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title%>
  </div>
  <div class="field">
    <%= f.label :description%><br />
    <%= f.text_area :description %>
  </div>
  <div>
    <%= f.fields_for :upload do |builder| %>
      <%= render 'upload_fields', f: builder %>
    <% end %>
    <%= link_to_add_fields "Add Upload", f, :uploads %>  
  </div>
  <div class="actions">
    <%= f.submit%>
  </div>
<% end %>

部分...

<fieldset>
  <%= f.label :file %><br />
  <%= f.file_field :file %>
  <%= f.hidden_field :_destroy %>
  <%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>

不要认为 javascript 会影响,所以我不会把它放在这里。我如何解决多态关联上的“无法批量分配受保护的属性”?

请在这方面需要任何人的帮助。不敢相信我不能上传文件,在教程上看起来很简单,而且它不起作用,或者我得到一个不能批量分配或上传它没有保存....

4

3 回答 3

0

尝试使用@post.uploads.build而不是@post.uploads.new

于 2013-04-08T19:15:44.417 回答
0

关联模型需要知道她父母的身份才能保存关系。我向您推荐以下 railscast:多态关联。

#uploads_controller.rb
before_filter :load_uploadable

def create
  @upload = @uploadable.uploads.new(params[:upload])
....
end

private

def load_uploadable
  resource, id = request.path.split('/')[1, 2] # /posts/1
  @uploadable = resource.singularize.classify.constantize.find(id)
end
于 2013-10-15T14:59:42.643 回答
-1

您视图中的这一行:

<%= f.fields_for :upload do |builder| %>

应该是这样的:

<%= f.fields_for :uploadable do |builder| %>

因为Post模型上的关联被称为“可上传”,而不是“上传”。

要使嵌套属性起作用,您需要指定模型确实接受此模型的嵌套属性,这可以通过将此行放在belongs_to模型中的下方来完成:

accepts_nested_attributes_for :uploadable

然后您需要使这些属性可访问,您可以这样做:

attr_accessible :uploadable_attributes
于 2012-11-08T22:55:52.537 回答