2

私はPersonモデルを持っています:

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 変数がNIL ではないことを意味します。

しかし、画像を選択して送信をクリックすると、更新メソッドで次のエラーが発生します。

Mongoid::エラー::DocumentNotFound

属性 {:name=>nil} を持つクラス Person のドキュメントが見つかりません。

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

リクエストパラメータ

{"utf8"=>"✓&quot;, "_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 を使用しています。

4

1 に答える 1

1

フォームに人の名前を付けないparams[:name]でくださいnil。隠しフィールドを追加して名前を保持し(idの方が良い)、パラメーターを使用してコントローラーで取得できます。

これを試して :

<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 つの gembetter_errorsと をインストールすることもbinding_of_callerできます。これらは問題のデバッグに役立ちます。

于 2013-09-11T14:14:42.633 に答える