我有人型号:
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 =&gt; 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。
答案 0 :(得分:1)
您不会在表单中提供此人的姓名,因此params[:name]
为nil
。
您可以添加隐藏字段以保持名称( id 更好),并使用params在控制器中获取它。
试试这个:
<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
操作不会更改)
您还可以安装此2个宝石better_errors
和binding_of_caller
,它们可以帮助您调试问题。