Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更新控制器不保存附加文件ruby on rails_Ruby On Rails_Ruby On Rails 4_Carrierwave - Fatal编程技术网

Ruby on rails 更新控制器不保存附加文件ruby on rails

Ruby 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

在我的应用程序中,我有一个项目,每个项目用户都可以上传许多资产。上传是通过载波完成的。 我有两个问题:

1是否有更好的方法编写create方法

2如何更改更新方法以更新附件

模型project.rb

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