【问题标题】:Papaerclip not working with update method回形针不适用于更新方法
【发布时间】:2013-09-11 13:03:26
【问题描述】:

我有模型:

class Person
  include Mongoid::Document
  include Mongoid::MultiParameterAttributes
  include Mongoid::Paperclip

  attr_accessible :photo,:name
  has_mongoid_attached_file :photo, :styles => {:thumb => "100x100>" }, default_url: "/images/:style/missing.png"

  field :photo
  field :name  
end  

在我的 ManagedbController更新操作 中,我这样做了:

def edit
    @person=Person.find_by(name: params[:name])
end

def update
    @person=Person.find_by(name: params[:name])
    @person.update_attributes(photo: params[:photo])
end  

edit.html.erb

<h2> Add photo here!</h2>
<%= @person.name %>

<%= form_for @person, url: {controller: :managedb,action: :update}, html: {mulitpart: true}  do |f| %>
  <p><%= f.hidden_field :name %></p>
  <p><%= f.file_field :photo %></p>
  <p><%= f.submit :submit , class: "btn btn-large btn-success" %></p>
<% end %>  

当我访问编辑页面时,我从 @person.name 获得了人的姓名,这意味着 @person 变量是 NOT NIL

但是当我选择一张图片并点击提交时,我在更新方法上收到此错误:

Mongoid::Errors::DocumentNotFound

找不到具有属性 {:name=>nil} 的类 Person 的文档。

 @person=Person.find_by(name: params[:name])  

请求参数

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"jpm+Ljk6rvZP9bIUw2gA9BvfZXsnATzsIpEEJMTbuzY=", "person"=>{"name"=>"child", "photo"=>#<ActionDispatch::Http::UploadedFile:0x007ffa20a05330 @original_filename="deepika-padukone-61a.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"person[photo]\"; filename=\"deepika-padukone-61a.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/b2/v1ytdy497fj9md28f7pr9wgm0000gn/T/RackMultipart20130911-3884-daf5yu>>}, "commit"=>"submit", "controller"=>"managedb", "action"=>"update"}

Rack session

这里有什么问题?帮助!我正在使用 Mongoid 和 Rails 3.2.13。

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid paperclip


    【解决方案1】:

    您没有在表单中提供此人的姓名,因此params[:name]nil。 您可以添加一个隐藏字段以保留 nameid 更好)并使用参数将其放入控制器中。

    试试这个:

    <h2> Add photo here!</h2>
    <%= @person.name %>
    
    <%= form_for @person, url: {controller: :managedb,action: :update}, html: {mulitpart: true}  do |f| %>
      <p><%= f.hidden_field :name %></p>
      <p><%= f.file_field :photo %></p>
      <p><%= f.submit :submit , class: "btn btn-large btn-success" %></p>
    <% end %> 
    

    编辑

    我建议您将 ManageDbController 中的操作分开:1 以显示表单(应为 edit)和另一个 1 以更新您的模型(update 操作不要更改)。

    您也可以安装这两个 gems better_errorsbinding_of_caller,它们可以帮助您调试问题。

    【讨论】:

    • 现在它给出了未初始化的常量 PersonsController。检查我的问题,我已经更新了。更新操作在另一个控制器中,并且没有控制器作为 PersonsController
    • 查看生成的html中的action属性并检查url。看来from_for 不在乎 url 参数。
    • 我不明白发生了什么。现在我又得到了 Mongoid::Errors::DocumentNotFound!!多部分正在工作。更新了问题。
    • @person 是否更新了?图片已上传到您的文件系统中??
    • 我已经更新了我的答案;)。如果它不能解决您的问题,请显示您的路线。
    猜你喜欢
    • 2011-07-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2014-06-09
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多