rails接受多态关联的嵌套属性

时间:2012-11-08 22:51:28

标签: ruby-on-rails file-upload nested-forms polymorphic-associations

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

这是一个具有多态关联的嵌套表单。

模型

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

我也试过把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会影响,所以我不打算把它放在这里。 我如何解决多态分析中的“无法大量分配受保护的属性”?

Plz需要帮助这个人。不能相信我不能上传文件,看起来如此简单的教程,它不工作,或我得到一个不能大规模分配或上传它没有保存....

3 个答案:

答案 0 :(得分:0)

尝试使用@post.uploads.build代替@post.uploads.new

答案 1 :(得分:0)

关联模型需要知道其父级的身份以保存关系。 我建议您使用以下railscast:Polymorphic Association.

#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

答案 2 :(得分:-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
相关问题