0

アプリケーション:

私の Rails (v3.2.17) プロジェクトには、次のクラスがあります。

class User < ActiveRecord::Base
  has_many :photos, dependent: :destroy

  accepts_nested_attributes_for :photos, :allow_destroy => true
  attr_accessible photos_attributes

と:

class Photo < ActiveRecord::Base
  belongs_to :user
  attr_accessible :name, :picture
  has_attached_file :picture, :styles => { :medium => "370x370#", :thumb => "120x120#" }

  validates :name, :presence => true

paperclipは写真のアップロードを処理するために使用します。

ユーザー フォームでは、gem を使用しnested_formてネストされた写真フォームを動的に作成します。私のユーザーフォームビューは次のようになります:

<%= simple_nested_form_for(@user, :remote => true) do |f| %>
  <%= f.error_notification %>

  <div id="photos">
    <%= f.fields_for(:photos) %>
  </div>

  <div class="add_new_photo_container">
    <%= f.link_to_add(:photos, {:id => "add_new_photo", :data => {:target => "#photos"}}) do %>
      Add photo
    <% end %>
  </div>

  <%= f.button(:submit, @user.new_record? ? 'create' : 'update', :id => "submit_form") %>
<% end %>

nested_attribute 写真のフォーム内に、file_field があります。Ajaxを使用してユーザーフォームを送信したいのですが、ファイルをajax経由で送信できないため、remotipartこれを処理するためにgemも使用しています。私photo_fieldsはこのようなものです:

<%= f.link_to_remove(:class => "remove_photo_form") do %>

<%= f.file_field :picture, accept: 'image/png,image/gif,image/jpeg,image/jpg', :class => 'upload_picture'  %>
<%= f.input(:name) %>

私のコントローラーにはcreateメソッドがあります:

def create
  @user = User.new(params[:user])
  if @user.save
    respond_to do |format|
      format.js {}
    end
  else
    respond_to do |format|
      format.js { render 'reload_form' }
    end
  end
end

そしてreload_form.js.erb次のようになります:

$('#user_form').replaceWith("<%= j (render 'users/form') %>");

何が機能しますか:

多くの写真を含むユーザーを送信し、各写真の名前を指定すると、成功例は完全に機能します。

名前なしで写真を送信した場合(名前の存在が必要です)、写真ファイルなしで送信した場合のエラーケースは正常に機能します。フォームがリロードされ、HTML にエラーが表示されます。これはRailsのログです:

Started POST "/en/users" for 127.0.0.1 at 2015-06-23 22:31:18 -0300
Processing by UsersController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"RmKyaIap0fJlIECa65oj0PLncYqxyAJ0OzPc7H3eiZg=", "user"=>{"photos_attributes"=>{"0"=>{"_destroy"=>"false", "name"=>""}, "1"=>{"_destroy"=>"false", "name"=>""}}, "starts_at"=>"", "finishes_at"=>""}, "commit"=>"Create", "locale"=>"en"}

機能しないもの:

名前なしで写真を送信したのに画像ファイルをアップロードした場合のエラーケースは機能しません。

この場合、remotipart画像を ajax 形式で送信するように動作します。f.link_to_addしかし、 fromをリロードするときに何らかのエラーが発生しますnested_form。エラーは表示されませんが、フォームもリロードされません。

そして、これは Post が機能しないときの Rails ログです。

Started POST "/en/users" for 127.0.0.1 at 2015-06-23 22:31:53 -0300
Processing by UsersController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"RmKyaIap0fJlIECa65oj0PLncYqxyAJ0OzPc7H3eiZg=", "user"=>{"photos_attributes"=>{"0"=>{"_destroy"=>"false", "name"=>"", "picture"=>#<ActionDispatch::Http::UploadedFile:0x43d5a40 @original_filename="avatar.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[photos_attributes][0][picture]\"; filename=\"avatar.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:C:/Users/EVEDOV~1/AppData/Local/Temp/RackMultipart20150623-1552-ka9clf>>}, "1"=>{"_destroy"=>"false", "name"=>""}}, "starts_at"=>"", "finishes_at"=>""}, "commit"=>"Create", "remotipart_submitted"=>"true", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01", "locale"=>"en"}

Firebug コンソールであらゆる種類のエラーの表示を有効にすると、次のように表示されます。

Handler function DebuggerProgressListener.prototype.onStateChange threw an exception: [Exception... "Component returned failure code: 0x80004002 (NS_NOINTERFACE) [nsIWebProgress.DOMWindow]" nsresult: "0x80004002 (NS_NOINTERFACE)" location: "JS frame :: resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/main.js -> resource://gre/modules/devtools/server/actors/webbrowser.js :: DPL_onStateChange :: line 1439" data: no]Line: 1439, column: 0
DevToolsUtils.js (linha 60)
<Sistema>

[Exception... "Component returned failure code: 0x80004002 (NS_NOINTERFACE) [nsIWebProgress.DOMWindow]" nsresult: "0x80004002 (NS_NOINTERFACE)" location: "JS frame :: chrome://browser/content/browser.js :: TabsProgressListener.onStateChange :: line 13564" data: no]
tabbrowser.xml (linha 490)

TypeError: can't access dead object
htmlPanel.js (linha 1082, col 16)
<Sistema>

誰かが同様の問題に直面し、それを修正する方法を知っていますか?

私もgemに置き換えようとしましnested_formcocoonが、同じ問題に陥ります。

4

0 に答える 0