Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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 添加:多部分=>;true抛出未定义的方法“;名称“;错误_Ruby On Rails_File Upload_Paperclip - Fatal编程技术网

Ruby on rails 添加:多部分=>;true抛出未定义的方法“;名称“;错误

Ruby on rails 添加:多部分=>;true抛出未定义的方法“;名称“;错误,ruby-on-rails,file-upload,paperclip,Ruby On Rails,File Upload,Paperclip,我在这件事上画了个空白。我的问题是: 短版 我的image#create操作在映像上失败。save调用并为nil:NilClass抛出未定义的方法“name”。图像模型包括通过回形针gem上传文件 让我震惊的是: 只有当我在提交表单上包含:multipart=>true时,才会发生错误 当我把它拿出来的时候,表单工作得很好,当然除了图像文件没有上传。有关失败位置的详细信息,请参见下面的堆栈跟踪。在尝试为INSERT语句引用某些内容时,它似乎遇到了一个nil值,但我不知道是什么。我的控制器参数看起

我在这件事上画了个空白。我的问题是:

短版

我的
image#create
操作在
映像上失败。save
调用并为nil:NilClass抛出
未定义的方法“name”。图像模型包括通过
回形针
gem上传文件

让我震惊的是:

只有当我在提交表单上包含
:multipart=>true
时,才会发生错误

当我把它拿出来的时候,表单工作得很好,当然除了图像文件没有上传。有关失败位置的详细信息,请参见下面的堆栈跟踪。在尝试为INSERT语句引用某些内容时,它似乎遇到了一个nil值,但我不知道是什么。我的控制器参数看起来正常,我通过记录器检查以确保新的
Image
实例在点击save调用之前正确构建

额外细节

我会尽量按照重要性列出我能想到的所有细节:

  • 我正在使用并试图通过S3存储,尽管当我完全注释掉图像模型中的
    has_attached_file
    行时,仍然会出现此问题

  • Image是集合中的嵌套资源,在其
    to_param
    方法中由slug引用

  • 我有一个多租户系统的基础知识(又名Basecamp风格的用户子域,通过一个范围涵盖所有组件的中心用户模型实现)

传递给控制器的参数

{"utf8"=>"✓",
 "authenticity_token"=>"JYCMky7851j5cW4ChSWUCCL/02iePf6i/QWAgR8q5tE=",
 "image"=>{"name"=>"My testerific image 2",
 "slug"=>"my-testerific-image-2",
 "description"=>"w",
 "collection_id"=>"2",
 "sort"=>"3",
 "picture_file_name"=>#<ActionDispatch::Http::UploadedFile:0x00000101b3f540 @original_filename="David's pic 005.jpeg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"image[picture_file_name]\"; filename=\"David's pic 005.jpeg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/df/mvsv5cs137gbyl8r7h428zp40000gn/T/RackMultipart20110814-64770-duz6wu>>},
 "commit"=>"Create Image",
 "collection_id"=>"my-new-collection"}
{“utf8”=>“–œ”,
“真实性令牌”=>“JYCMky7851j5cW4ChSWUCCL/02iePf6i/QWAgR8q5tE=”,
“图像”=>{“名称”=>“我的测试图像2”,
“slug”=>“my-testerific-image-2”,
“说明”=>“w”,
“集合id”=>“2”,
“排序”=>“3”,
“picture_file_name”=>#',
#:full=>“800x800>”
#},
:storage=>:s3,
:s3_credentials=>Rails.root.join('config','s3.yml'),
:path=>“:id/:style/:filename”
def至_参数
self.name.parameterize
结束
私有的
def创建_段塞
self.slug=self.to_参数
结束
结束
更新2
我比较了使用
:multipart=>true构建的
Image
实例与不使用它的实例,并确认唯一的区别是文件上载字段,
picture\u file\u name
。不使用
:multipart=>true
,它是一个带有文件名的字符串(不足为奇)使用它,它是
ActionDispatch::Http::UploadedFile
的一个实例。鉴于堆栈跟踪在
to_yaml
调用过程中显示失败,问题可能在于
UploadedFile
实例转换为yaml?

您没有发布它,但我认为您应该使用
:html=>{:multipart=>true}
而不仅仅是
:multipart=>true
在您的表单中,如:

对象的
form_,:html=>{:multipart=>true}do|o|
...

好吧,我终于下定决心,通过记录器输出跟踪ActiveRecord源代码。结果,正如我所怀疑的,它无法保存
上传的文件,因为它无法将其转换为YAML

然而,这是因为我犯了一个愚蠢的错误。在我的提交表格中,我有:

<%= f.file_field :picture_file_name %>

当它应该是:

<%= f.file_field :picture %>

回形针
gem了解
:picture
是上传的文件,并使用背景魔法将文件名保存到正确的字段。我只是低估了使用的方便性


通常情况下,我会因为一些琐碎的事情而删除这个问题,但鉴于我犯了这个错误,其他人可能会在将来删除,而且没有什么东西可以为我指出解决方案。因此,我会继续保持它,以帮助将来谷歌搜索同样密集的开发人员!

尽管我花了大约一周的时间在同一个错误上我有正确的字段

引起我所有头痛的愚蠢只是视图中标签的顺序

导致错误

{"utf8"=>"✓",
 "authenticity_token"=>"JYCMky7851j5cW4ChSWUCCL/02iePf6i/QWAgR8q5tE=",
 "image"=>{"name"=>"My testerific image 2",
 "slug"=>"my-testerific-image-2",
 "description"=>"w",
 "collection_id"=>"2",
 "sort"=>"3",
 "picture_file_name"=>#<ActionDispatch::Http::UploadedFile:0x00000101b3f540 @original_filename="David's pic 005.jpeg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"image[picture_file_name]\"; filename=\"David's pic 005.jpeg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/df/mvsv5cs137gbyl8r7h428zp40000gn/T/RackMultipart20110814-64770-duz6wu>>},
 "commit"=>"Create Image",
 "collection_id"=>"my-new-collection"}
DatenightsController中的NoMethodError#为nil:NilClass创建未定义的methodname

<%= f.file_field :photo %>
<%= f.text_field :name %>

上述错误的解决方案(此处仅顺序/顺序非常重要)



由于这个问题占用了我很多宝贵的时间,我想它可能会对您有所帮助。

经过大量的搜索和调试。这个问题的主要症状是带有文件字段的表单被做成多部分表单,rails 3.2无法保存数据,因为它试图保存数据库中不存在的其他参数(文件对象的文件)

获取相应的值并将其保存到某个变量,然后从参数中删除文件哈希,似乎可以解决这个问题

下面是一个使用rails 3.2保存在数据库中的工作代码示例

file = params[:document][:file].tempfile.read
params[:document].delete(:file)
@document = Document.new(params[:document])   
respond_to do |format|
  if @document.save
@document.file = file
@document.save
    format.html { redirect_to @document, notice: 'Document was successfully created.' }
    format.json { render json: @document, status: :created, location: @document }
  else
    format.html { render action: "new" }
    format.json { render json: @document.errors, status: :unprocessable_entity }
  end
end

将您的模型代码添加到问题中。我这样做了,只是为了避免冗长。正如我在更新2中所说的,看起来多部分正在工作,至少在抛出错误之前是这样,因为使用它,
params[:picture\u file\u name]
包含一个UploadedFile的实例,而没有它,它只包含文件名的字符串。是的,我的错,我可以在params中看到它正在工作..通过查看您对问题的解决方案,我意识到不久前我也有相同的东西..一方面,在形式,但另一方面,有时不是;)
<%= f.text_field :name %>
<%= f.file_field :photo %>
file = params[:document][:file].tempfile.read
params[:document].delete(:file)
@document = Document.new(params[:document])   
respond_to do |format|
  if @document.save
@document.file = file
@document.save
    format.html { redirect_to @document, notice: 'Document was successfully created.' }
    format.json { render json: @document, status: :created, location: @document }
  else
    format.html { render action: "new" }
    format.json { render json: @document.errors, status: :unprocessable_entity }
  end
end