Ruby on rails 更新控制器不保存附加文件ruby on rails
在我的应用程序中,我有一个项目,每个项目用户都可以上传许多资产。上传是通过载波完成的。 我有两个问题: 1是否有更好的方法编写create方法 2如何更改更新方法以更新附件 模型project.rbRuby on rails 更新控制器不保存附加文件ruby on rails,ruby-on-rails,ruby-on-rails-4,carrierwave,Ruby On Rails,Ruby On Rails 4,Carrierwave,在我的应用程序中,我有一个项目,每个项目用户都可以上传许多资产。上传是通过载波完成的。 我有两个问题: 1是否有更好的方法编写create方法 2如何更改更新方法以更新附件 模型project.rb class Project < ActiveRecord::Base belongs_to :user has_many :assets end 下面是更新方法 def update respond_to do |format| if @project.upda
class Project < ActiveRecord::Base
belongs_to :user
has_many :assets
end
下面是更新方法
def update
respond_to do |format|
if @project.update(project_params)
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
else
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
您可以使用活动记录中内置的accepts_nested_attributes_for方法轻松处理创建、更新和销毁嵌套模型的操作 编辑以更改问题 你的原始问题似乎已经做了很多修改,让我看看是否可以帮你澄清一些事情 假设您的资产类有一个名为attachment的列,您有一个名为AttachmentUploader的carrierwave上传器类。然后,您可以将该类装入您的资产类,如您在问题中所示
mount_uploader :attachment, AttachmentUploader #CarrierWave
您在问题中没有显示表单标记,但根据控制器的project_params方法,似乎需要一个名为asset_attributes的属性。您需要确保表单正确地构建了该数组,这可以通过使用帮助器的字段\u轻松完成。如果您对该部分感到困惑,请参考此问题
基本上应该是这样的
项目/_form.html.erb
<%= form_for @project, :html => {:multipart => true} do |f| %>
<%= f.error_messages %>
<%= f.fields_for :assets do |builder| %>
<%= render 'assets_fields', :f => builder %>
<% end %>
<p><%= f.submit %></p>
<% end %>
只是打电话
project.save
或
将自动创建/更新/销毁嵌套资产,将整个流程包装在事务中,以使其全部成功或全部失败。唯一的期望是active record不能在数据库事务中包装载波操作,因此您可能最终在服务器上上传孤立的文件 谢谢,我换了型号,但还是有问题。我根据你的评论更新了questionwell,我尝试使用嵌套的_属性和多态关联。尽管如此,它仍然没有保存本文中的详细信息:
<%= form_for @project, :html => {:multipart => true} do |f| %>
<%= f.error_messages %>
<%= f.fields_for :assets do |builder| %>
<%= render 'assets_fields', :f => builder %>
<% end %>
<p><%= f.submit %></p>
<% end %>
<p>
<%= f.file_field :attachment %>
</p>
accepts_nested_attributes_for :assets, :allow_destroy => true
project.save
project.update